如何在Python脚本切换用户时同步设置文件所属用户组?
让切换用户后创建的文件用户与组归属一致的解决方案
你当前的代码仅通过seteuid(1000)切换了进程的有效用户ID,但有效组ID仍保持为root(ID 0),因此创建的文件所属组依然是root。要让文件的所有者和所属组都变为admin_user,需要同时切换进程的有效组ID,或在文件创建后手动修改归属。
方法1:切换用户时同步切换组ID
通过pwd模块获取admin_user的主组ID,调用setegid()切换进程的有效组ID,后续创建的文件会自动继承该组权限。
修改后的完整代码:
#!/usr/bin/env python3 from os import geteuid, seteuid, setegid import pwd def touch(fname): with open(fname, 'a') as f: pass if geteuid() == 0: touch("1.owned-by-root") touch("2.owned-by-root") # 获取admin_user的主组ID admin_info = pwd.getpwuid(1000) admin_gid = admin_info.pw_gid # 切换有效组ID和用户ID setegid(admin_gid) seteuid(1000) touch("1.owned-by-admin-user") touch("2.owned-by-admin-user")
说明:pwd.getpwuid(1000)会返回对应用户的完整信息,其中pw_gid是该用户的主组ID。切换组ID后,进程后续创建的文件会自动使用新的用户和组权限。
方法2:创建文件后手动修改归属
如果不需要修改进程的全局权限上下文,可以在文件创建后,用os.chown()强制修改文件的所有者和所属组。
修改后的完整代码:
#!/usr/bin/env python3 from os import geteuid, seteuid, chown import pwd def touch(fname): with open(fname, 'a') as f: pass if geteuid() == 0: touch("1.owned-by-root") touch("2.owned-by-root") seteuid(1000) admin_info = pwd.getpwuid(1000) admin_uid = admin_info.pw_uid admin_gid = admin_info.pw_gid # 创建文件 touch("1.owned-by-admin-user") touch("2.owned-by-admin-user") # 修改文件归属 chown("1.owned-by-admin-user", admin_uid, admin_gid) chown("2.owned-by-admin-user", admin_uid, admin_gid)
说明:这种方法仅针对目标文件修改归属,进程本身的组权限仍保持root,适合仅需调整特定文件归属的场景。
内容的提问来源于stack exchange,提问作者John Smith
相关产品推荐
相关产品推荐

