Создание файла с 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)
Как отметил Эллиот, если бы вы создавали несколько файлов одновременно, это было бы лучше структурировано как функция.