Come eseguire i metodi os. * Come root?
Domanda
È possibile richiedere un root pw senza archiviarlo nella mia memoria di script ed eseguire alcuni dei comandi os. * come root?
La mia sceneggiatura
- esegue la scansione di alcune cartelle e file per verificare se è possibile eseguire il lavoro
- apporta alcune modifiche in / etc / ...
- crea una cartella e file che dovrebbero essere di proprietà dell'utente che ha eseguito lo script
(1) può essere eseguito come utente normale. Posso fare (2) annullando lo script, ma poi la cartella e i file in (3) saranno root.
Il problema è che uso molti os.makedirs, os.symlink, ecc., il che mi impedisce di renderlo eseguibile da un normale utente.
Carri armati 2 tutti per suggerimenti
La soluzione finora è:
# do all in sudo
os.chown(folder, int(os.getenv('SUDO_UID')), int(os.getenv('SUDO_GID')))
grazie a gnibbler per il suggerimento.
Soluzione 5
gnibbler ha fornito un suggerimento su os.chown
. Il problema era quindi di conoscere l'ID dell'utente dietro a sudo. Tali informazioni sono archiviate nelle variabili di ambiente SUDO_ *
:
os.chown, (some_path, int(os.getenv('SUDO_UID')), int(os.getenv('SUDO_GID')))
Suddividere il codice in 3 file potrebbe essere una soluzione, ma il codice è già misto, quindi non è adatto.
Altri suggerimenti
Forse puoi mettere (2) in uno script separato, dire script2.py
, e nello script principale puoi chiamare sudo script2.py
con un popen
?
In questo modo solo (2) verrà eseguito come root.
yourscript.py
:
run_part_1()
subprocess.call(['sudo', sys.executable, 'part2.py'])
run_part_3()
part2.py
:
run_part_2()
Considereresti di usare Linux PAM ? Potresti dare un'occhiata a Guida per sviluppatori di applicazioni Linux-PAM e API Python per PAM
Dovresti eseguire il tuo script come root e fare le opportune modifiche alle autorizzazioni per (3) usando os.chmod e os.chown.
Sarebbe possibile eseguire un altro script con i privilegi di root tramite sudo, ma ciò richiederebbe anche la memorizzazione della password dell'utente nello script per passare a sudo, che è una terribile idea dal punto di vista della sicurezza.
Pertanto, il problema riguarda l'acquisizione delle autorizzazioni corrette su alcuni file / cartelle. Innanzitutto, passa o codifica l'URI / nome utente del tuo utente normale. Quindi utilizzare os.chown per modificare il proprietario e os.chmod per modificare le autorizzazioni. Ci sono anche metodi chown / chmod alternativi nel pacchetto os che dovresti guardare: http: // docs .python.org / library / os.html
Un'ultima nota: non devi preoccuparti delle autorizzazioni dei link simbolici. Hanno i permessi di ciò che indicano.