如何用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
相关产品推荐
相关产品推荐

