2014-09-11 5 views
7

У меня есть простой кусок питон скрипт называется myCreate.py работает на Linux:
fo = open("./testFile.txt", "wb")Создание файла с помощью питона Sudo делает его владельцем корня

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

testfile.txt не был запущен ранее в обоих исполнениях

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

+0

'chown' это после того, как вы его создания. –

+0

Я хочу, чтобы он был открыт как настоящий пользователь, безразличный, кто это ... не что-то жестко закодированное – ABR

+0

Вы можете определить текущего пользователя и сделать это. –

ответ

6

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

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

Таким образом, вы можете сделать:

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) 

EDIT: Обновлен мой ответ спасибо @Basilevs, @ Robᵩ и @ 5gon12eder

+0

Отличное объяснение, но не будет ли 'SUDO_UID' более удобным, чем' SUDO_USER'? –

+0

@ Robᵩ или даже безопаснее? – Basilevs

+0

Он будет более переносимым, чтобы просто не 'chown' файла, если' SUDO_USER' не установлен. – 5gon12eder

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) 

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

2

Использование os.chown(), используя os.environ найти подходящий идентификатор пользователя:

import os 

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