Python批量修改目录组权限:为user_a配置logs只读访问
批量配置logs目录只读权限及父目录组权限的解决方案
核心需求回顾
- 目标目录:
/app/<app_name>/server/logs(共约100个不同<app_name>实例) - 权限要求:
- user_a(已加入group_a)对所有logs目录及其内部文件拥有只读权限
- logs目录的父目录(
/app/<app_name>/server)及logs自身的组需改为group_a,并赋予组r-x权限 - 仅处理server目录下的logs目录,不涉及其他路径
- 限制条件:服务器仅支持Python 3.4及以下,需避免
os.chmod清除原有权限,实现递归批量处理
解决方案思路
- 权限修改原则:基于文件原有权限进行位运算,保留所有者及其他用户的原有权限,仅调整组权限:
- 目录(含server和logs目录及其子目录):确保组拥有
r-x权限,移除组的写权限 - 文件:确保组拥有
r--权限,移除组的写和执行权限
- 目录(含server和logs目录及其子目录):确保组拥有
- 递归处理:用
os.walk遍历logs目录下所有内容,实现深度权限修改 - 组ID获取:通过
grp模块获取group_a的GID,避免硬编码
Python 3.4兼容脚本
import os import stat import grp def fix_logs_permissions(app_name): # 构建目标路径(兼容Python 3.4,避免f-string) server_dir = "/app/{}/server".format(app_name) logs_dir = os.path.join(server_dir, "logs") # 跳过不存在的路径 if not os.path.exists(logs_dir): print("Warning: {} does not exist, skipping".format(logs_dir)) return # 获取group_a的GID,异常处理避免脚本崩溃 try: group_gid = grp.getgrnam('group_a').gr_gid except KeyError: print("Error: group_a does not exist, aborting") return # 处理server父目录:修改组+调整权限 os.chown(server_dir, -1, group_gid) server_stat = os.stat(server_dir) # 保留原有权限,添加组r-x,移除组写权限 new_server_mode = server_stat.st_mode | stat.S_IRGRP | stat.S_IXGRP new_server_mode &= ~stat.S_IWGRP os.chmod(server_dir, new_server_mode) # 递归处理logs目录及其内部所有内容 for root, dirs, files in os.walk(logs_dir): # 处理当前目录的组和权限 os.chown(root, -1, group_gid) dir_stat = os.stat(root) new_dir_mode = dir_stat.st_mode | stat.S_IRGRP | stat.S_IXGRP new_dir_mode &= ~stat.S_IWGRP os.chmod(root, new_dir_mode) # 处理当前目录下的文件 for file in files: file_path = os.path.join(root, file) os.chown(file_path, -1, group_gid) file_stat = os.stat(file_path) # 保留原有权限,添加组读权限,移除组写/执行权限 new_file_mode = file_stat.st_mode | stat.S_IRGRP new_file_mode &= ~(stat.S_IWGRP | stat.S_IXGRP) os.chmod(file_path, new_file_mode) # 批量处理/app下所有app目录 if __name__ == "__main__": app_root = "/app" # 筛选/app下的子目录作为app_name app_dirs = [ d for d in os.listdir(app_root) if os.path.isdir(os.path.join(app_root, d)) ] for app_name in app_dirs: print("Processing app: {}".format(app_name)) fix_logs_permissions(app_name)
关键说明
- 避免权限清除:脚本通过
stat.st_mode获取文件原有权限,使用位运算|(添加权限)和& ~(移除权限),不会覆盖所有者或其他用户的原有权限 - 递归处理:
os.walk自动遍历logs目录下所有子目录和文件,解决之前脚本无法深入子目录的问题 - 权限验证:执行脚本后可通过以下命令验证:
- 查看目录权限:
ls -ld /app/<test_app>/server /app/<test_app>/server/logs,确认组为group_a,权限含r-x - 查看文件权限:
ls -l /app/<test_app>/server/logs/,确认组为group_a,权限含r-- - 切换到user_a测试:尝试读取文件(应成功)、修改/删除文件(应失败)
- 查看目录权限:
运行注意事项
- 需以root或拥有文件修改权限的用户运行脚本
- 确保user_a已正确加入group_a(可通过
groups user_a验证) - 建议先选取1-2个测试目录运行,确认权限修改符合预期后再批量执行
内容的提问来源于stack exchange,提问作者danidar
相关产品推荐
相关产品推荐

