You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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清除原有权限,实现递归批量处理

解决方案思路

  1. 权限修改原则:基于文件原有权限进行位运算,保留所有者及其他用户的原有权限,仅调整组权限:
    • 目录(含server和logs目录及其子目录):确保组拥有r-x权限,移除组的写权限
    • 文件:确保组拥有r--权限,移除组的写和执行权限
  2. 递归处理:用os.walk遍历logs目录下所有内容,实现深度权限修改
  3. 组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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 05:20:26