使用sudo使用python创建文件使其所有者为root

时间:2014-09-11 15:21:25

标签: python linux file owner

我在linux上运行了一个名为myCreate.py的简单python脚本:
fo = open("./testFile.txt", "wb")

当我运行python ./myCreate.py时 - testFile.txt的所有者仍然是我的用户。 当我运行sudo python ./myCreate.py时 - testFile.txt的所有者现在是root。

testFile.txt以前没有运行到两个执行

如何让文件的所有者保持真实用户而不是有效用户?! 谢谢!

3 个答案:

答案 0 :(得分:6)

使用sudo运行脚本意味着您以root身份运行它。所以你的文件由root拥有是正常的。

您可以做的是在创建文件后更改文件的所有权。为此,您需要知道哪个用户运行sudo。幸运的是,使用sudo时会设置一个SUDO_UID环境变量。

所以,你可以这样做:

import os
print(os.environ.get('SUDO_UID'))

然后,您需要change the file ownership

os.chown("path/to/file", uid, gid)

如果我们把它放在一起:

import os

uid = int(os.environ.get('SUDO_UID'))
gid = int(os.environ.get('SUDO_GID'))

os.chown("path/to/file", uid, gid)

当然,你会希望它作为一个功能,因为它更方便,所以:

import os

def fix_ownership(path):
    """Change the owner of the file to SUDO_UID"""

    uid = os.environ.get('SUDO_UID')
    gid = os.environ.get('SUDO_GID')
    if uid is not None:
        os.chown(path, int(uid), int(gid))

def get_file(path, mode="a+"):
    """Create a file if it does not exists, fix ownership and return it open"""

    # first, create the file and close it immediatly
    open(path, 'a').close()

    # then fix the ownership
    fix_ownership(path)

    # open the file and return it
    return open(path, mode)

用法:

# If you just want to fix the ownership of a file without opening it
fix_ownership("myfile.txt")

# if you want to create a file with the correct rights
myfile = get_file(path)

编辑:感谢@Basilevs,@Robᵩ和@ 5gon12eder

更新了我的答案

答案 1 :(得分:2)

如何使用os.stat首先获取包含文件夹的权限,然后将其应用于文件帖子创建。

这看起来像(使用python2):

import os

path = os.getcwd()
statinfo = os.stat(path)

fo = open("./testFile.txt", "wb")
fo.close()
euid = os.geteuid()
if (euid == 0) # Check if ran as root, and set appropriate permissioning afterwards to avoid root ownership
    os.chown('./testFile.txt', statinfo.st_uid, statinfo.st_gid)

正如Elliot指出的那样,如果你要同时创建几个文件,那么这将更好地构建为一个函数。

答案 2 :(得分:2)

使用os.chown(),使用os.environ查找相应的用户ID:

import os

fo = open("./testFile.txt", "wb")
fo.close()
os.chown('./testFile.txt',
         int(os.environ['SUDO_UID']),
         int(os.environ['SUDO_GID']))