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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 01:57:38