2014-09-11 8 views
7

ho un semplice pezzo di script Python chiamato myCreate.py in esecuzione su Linux:
fo = open("./testFile.txt", "wb")Creazione di un file con Python usando sudo fa la sua radice proprietario

quando ho eseguito python ./myCreate.py - il proprietario del testFile.txt rimane il mio utente. quando eseguo sudo python ./myCreate.py - il proprietario di testFile.txt è ora root.

testFile.txt non è stato eseguito in precedenza per entrambe le esecuzioni

come posso fare il proprietario del file rimanere l'utente reale e non l'utente effettivo ?! Grazie!

+0

'chown' che dopo averlo creato. –

+0

voglio che si apra come l'utente reale, senza reagenti di chi è ... non qualcosa di codificato – ABR

+0

È possibile determinare l'utente corrente e chown a quello. –

risposta

6

esecuzione dello script con sudo significa che si esegue come root. Quindi è normale che il tuo file sia di proprietà di root.

Quello che si potrebbe fare è modificare la proprietà del file dopo che è stato creato. Per fare ciò, è necessario sapere quale utente esegue sudo. Fortunatamente, esiste una variabile di ambiente SUDO_UID impostata quando si utilizza sudo.

Quindi, si può fare:

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

Quindi, è necessario change the file ownership:

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

Se mettiamo insieme:

import os 

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

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

Naturalmente, ti Lo voglio come una funzione, perché è più conveniente, quindi:

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) 

Usage:

# 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: aggiornato la mia risposta grazie a @Basilevs, @ Robᵩ e @ 5gon12eder

+0

Ottima spiegazione, ma "SUDO_UID" non sarebbe più conveniente di "SUDO_USER"? –

+0

@ Robᵩ o addirittura più sicuro? – Basilevs

+0

Sarà più semplice non "chown" il file se "SUDO_USER" non è impostato. – 5gon12eder

2

Come utilizzare os.stat per ottenere prima le autorizzazioni della cartella contenente e quindi applicarle al file dopo la creazione.

questo sarebbe simile (usando 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) 

Come Elliot sottolineato, se si dovesse essere la creazione di più file contemporaneamente, questo sarebbe meglio strutturata come una funzione.

2

Usa os.chown(), utilizzando os.environ Per trovare l'ID utente appropriato:

import os 

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