2014-09-11 26 views
7

i ein einfaches Stück Python-Skript haben auf Linux namens myCreate.py ausgeführt wird:
fo = open("./testFile.txt", "wb")eine Datei mit Python erstellen sudo macht seinen Besitzer root

wenn ich Python ./myCreate.py laufen - der Besitzer testFile.txt bleibt mein Benutzer. wenn ich sudo python ./myCreate.py ausführen - der Besitzer von testFile.txt ist jetzt root.

Testfile.txt war bisher nicht auf beide der Hinrichtung laufen

wie kann ich die Besitzer der Datei mache die realen Benutzer bleiben und nicht die effektiven Benutzer ?! Danke!

+0

'chown' es, nachdem Sie es erstellen. –

+0

ich will es als reale Benutzer öffnen, reagardless, wer das ist ... nicht etwas hart codiert – ABR

+0

Sie können den aktuellen Benutzer und chown zu, die bestimmen. –

Antwort

6

Laufen Ihr Skript mit sudo bedeutet, dass Sie es als root ausführen. Es ist also normal, dass Ihre Datei im Besitz von root ist.

Sie können die Eigentümerschaft der Datei ändern, nachdem sie erstellt wurde. Um dies zu tun, müssen Sie wissen, welcher Benutzer sudo ausführt. Glücklicherweise gibt es eine SUDO_UID Umgebungsvariable, die gesetzt wird, wenn Sie sudo verwenden.

So können Sie tun:

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

Dann müssen Sie change the file ownership:

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

Wenn wir es zusammen:

import os 

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

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

Natürlich, werden Sie will es als Funktion, weil es bequemer ist, also:

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) 

Verbrauch:

# 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: Aktualisiert meine Antwort dank @Basilevs, @ Robᵩ und @ 5gon12eder

+0

Große Erklärung, aber wäre 'SUDO_UID' nicht bequemer als' SUDO_USER'? –

+0

@ Robᵩ oder noch sicherer? – Basilevs

+0

Es ist portabler, die Datei einfach nicht zu "chownen", wenn 'SUDO_USER' nicht gesetzt ist. – 5gon12eder

2

Wie wäre es os.stat mit zunächst die Berechtigungen des übergeordneten Ordner zu erhalten und sie dann in die Datei Post Schaffung Anwendung.

dies würde in etwa so aussehen (mit 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) 

Als Elliot wies darauf hin, wenn Sie mehrere Dateien gleichzeitig zu erschaffen sind, das wäre besser als eine Funktion strukturiert.

2

Verwenden os.chown(), os.environ mit dem entsprechenden Benutzer-ID zu finden:

import os 

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