Python3创建文件时如何指定所有者与用户组?
直接创建指定所有者和用户组的文件是否可行?
在Linux环境下,直接以root身份运行Python代码时,无法通过open()函数直接创建所有者为moon、用户组为san的文件——因为open()本身不支持指定文件的所有者和组属性,创建文件时默认会继承当前进程的所有者和组(此处为root:root)。
要实现目标,有两种可行方案:
方案1:先创建文件,再修改所有者和组
这是最直接的常规方式,创建文件后通过Python内置方法或系统命令修改属性:
使用Python内置os.chown()
import os import pwd with open('/home/moon/test.txt', 'w') as f: print(some_list, file=f) # 查询moon用户的UID和san组的GID moon_uid = pwd.getpwnam('moon').pw_uid san_gid = pwd.getpwnam('san').pw_gid # 修改文件所有者和组 os.chown('/home/moon/test.txt', moon_uid, san_gid)
使用subprocess调用系统chown命令
import subprocess with open('/home/moon/test.txt', 'w') as f: print(some_list, file=f) # 执行系统命令修改属性 subprocess.run(['chown', 'moon:san', '/home/moon/test.txt'], check=True)
方案2:切换用户身份创建文件
若要直接以目标用户身份创建文件,可借助root权限切换UID/GID后再创建,此时文件会自动继承切换后的用户和组属性:
import os import pwd # 获取moon的UID和san的GID moon_uid = pwd.getpwnam('moon').pw_uid san_gid = pwd.getpwnam('san').pw_gid # 先切换组,再切换用户(root权限下才可执行) os.setgid(san_gid) os.setuid(moon_uid) # 此时创建的文件所有者为moon,用户组为san with open('/home/moon/test.txt', 'w') as f: print(some_list, file=f)
注意:切换UID后无法再切回root身份,因此该方式仅适合仅需创建文件的场景,后续代码会以moon用户权限运行。
总结:无法通过open()直接指定文件的所有者和组,要么创建后修改属性,要么切换用户身份创建。
内容的提问来源于stack exchange,提问作者Judy
相关产品推荐
相关产品推荐

