Создание файла с python с помощью sudo делает его владельцем root

У меня есть простой фрагмент скрипта python под названием myCreate.py запуск в linux:
fo = open("./testFile.txt", "wb")

когда я запускаю python ./myCreate.py -владелец testFile.txt остается моим пользователем. когда я запускаю sudo python ./myCreate.py -владелец testFile.txt теперь корень.

вопросами и ответами.txt не был запущен ранее для обоих казней

Как я могу сделать владельцем файла реального пользователя, а не пользователя?! Спасибо!

3 ответов


запуск скрипта с sudo означает, что вы запускаете его как root. Таким образом, это нормально, что ваш файл принадлежит root.

что вы можете сделать, это изменить право собственности на файл после его создания. Для этого вам нужно знать, какой пользователь запускает sudo. К счастью, есть SUDO_UID переменная среды, которая устанавливается при использовании sudo.

Итак, вы можете сделать:

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

тогда вам нужно изменить файл собственность:

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)

EDIT: обновлен мой ответ благодаря @Basilevs, @Robᵩ и @5gon12eder


использовать 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']))

Как насчет использования os.stat чтобы сначала получить разрешения содержащей папки,а затем применить их к созданию файла post.

это будет выглядеть примерно так (используя вместо 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)

Как отметил Эллиот, если бы вы создавали несколько файлов одновременно, это было бы лучше структурировано как функция.