2013-03-29 3 views
10

In meinem Python-Skript führe ich einige Operationen aus, die Root-Rechte benötigen. Ich erstelle und schreibe auch Dateien, die nicht ausschließlich von root, sondern von dem Benutzer verwaltet werden sollen, der mein Skript ausführt.Root-Rechte für bestimmte Operationen in Python löschen

Normalerweise verwende ich mein Skript mit sudo. Gibt es eine Möglichkeit, das oben genannte zu tun?

+0

Wenn Sie mit 'sudo' laufen lassen, können Sie immer' chown' an den Besitzer des '__FILE__' nach 're done – slezica

+0

@ uʍopǝpısdn Ja ... aber Dinge wie das wird schnell rasant, wenn Sie nicht sehr vorsichtig sind. – thejh

+0

Ich habe es nicht verstanden, sorry. Es ist root, das alle Dateien erstellt (Folge von 'sudo'). Wie kann ich die Benutzer-ID desjenigen abrufen, der mein Skript ausführt? –

Antwort

10

Sie können zwischen den uid os.seteuid() verwenden. Dies unterscheidet sich von os.setuid() darin, dass Sie zu Root-Rechten zurückkehren können, wenn Sie sie benötigen.

zum Beispiel den folgenden Befehl als root:

import os 

open('file1', 'wc') 

# switch to userid 501 
os.seteuid(501) 
open('file2', 'wc') 

# switch back to root 
os.seteuid(0) 
open('file3', 'wc') 

Das schafft file1 und file3 als Wurzel, sondern file2 als Benutzer mit uid 501.

Wenn Sie ermitteln möchten, welcher Benutzer ruft Ihr Skript, sudo zwei Umgebungsvariablen setzt:

SUDO_USER 
SUDO_UID 

Beziehungsweise den Benutzer Name und die UID des Benutzers, der sudo aufgerufen hat. So könnten Sie int(os.environ['SUDO_UID']) mit os.seteuid() verwenden.

1

http://linux.die.net/man/8/sudo Zitat:
Die reale und effektive uid und gid gesetzt

Ihre einzige Möglichkeit, zu wissen, welcher Benutzer So verwenden diejenigen des Zielbenutzers entsprechen ist das Ziel Benutzer entweder von einer Config lesen Datei oder eine Cmdline-Option oder eine Art heuristischen Ratens.

Eine gute Idee ist das sogenannte Rechte-Shedding: Beginne mit Root-Privilegien, dann tu, wofür du sie neddest. Dann werden Sie ein weniger privilegierter Benutzer.
Sie würden das os-Modul für die Verwendung: http://docs.python.org/2/library/os.html#os.setuid

1

Ich habe festgestellt, dass die Verwendung von os.seteuid und os.setegid die root-Berechtigungen nicht wirklich gelöscht hat. Nachdem ich sie angerufen hatte, konnte ich immer noch Dinge tun, die Root-Rechte erforderten. Die Lösung, die ich gefunden, war gearbeitet zu verwenden os.setresuid und os.setresgid statt:

sudo_uid = int(os.getenv("SUDO_UID")) 
sudo_gid = int(os.getenv("SUDO_GID")) 

# drop root privileges 
os.setresgid(sudo_gid, sudo_gid, -1) 
os.setresuid(sudo_uid, sudo_uid, -1) 

subprocess.call("mkdir /foo1", shell = True) # should fail 

# regain root privileges 
os.setresgid(0, 0, -1) 
os.setresuid(0, 0, -1) 

subprocess.call("mkdir /foo2", shell = True) # should succeed 
Verwandte Themen