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

如何用Python递归为目录设置setgid权限(权限改为drwxrwsrwx)

用Python递归为目录添加setgid权限

要递归为目录设置setgid权限并将权限修改为drwxrwsrwx(对应八进制0o2777),可以通过Python的os模块实现,无需依赖Linux命令。

核心原理

  • setgid的特殊权限位为八进制0o2000,设置后目录下新建的文件/子目录会继承该目录的用户组
  • 目标权限drwxrwsrwx等价于基础权限0o777加上setgid位0o2000,即0o2777

实现代码

方式一:直接设置目标权限

适合明确需要将所有目录权限改为drwxrwsrwx的场景:

import os

def set_setgid_recursive(target_path):
    # 遍历所有目录(包括目标路径本身)
    for root, dirs, _ in os.walk(target_path):
        # 修改当前遍历到的根目录权限
        os.chmod(root, 0o2777)
        # 修改当前目录下的所有子目录权限
        for dir_name in dirs:
            dir_full_path = os.path.join(root, dir_name)
            os.chmod(dir_full_path, 0o2777)

# 替换为你的目标目录路径
target_directory = "/your/target/directory"
set_setgid_recursive(target_directory)

方式二:基于原有权限增量修改

如果想保留目录原有权限的基础上添加setgid和必要的写权限(从drwxr-xr-x到drwxrwsrwx),可以用按位或操作:

import os

def add_setgid_recursive(target_path):
    for root, dirs, _ in os.walk(target_path):
        # 处理当前根目录
        current_mode = os.stat(root).st_mode
        # 添加setgid位(0o2000)、组写权限(0o020)、其他写权限(0o002)
        new_mode = current_mode | 0o2000 | 0o022
        os.chmod(root, new_mode)
        
        # 处理子目录
        for dir_name in dirs:
            dir_full_path = os.path.join(root, dir_name)
            current_mode = os.stat(dir_full_path).st_mode
            new_mode = current_mode | 0o2000 | 0o022
            os.chmod(dir_full_path, new_mode)

target_directory = "/your/target/directory"
add_setgid_recursive(target_directory)

注意事项

  • 执行脚本需要足够的权限(如root用户,或目录的所有者)
  • setgid仅对目录有效,无需处理文件
  • os.walk默认按自上而下顺序遍历,先修改父目录再修改子目录,符合setgid权限继承的逻辑

内容的提问来源于stack exchange,提问作者Boss Boss

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 15:17:28