Domanda

È possibile richiedere un root pw senza archiviarlo nella mia memoria di script ed eseguire alcuni dei comandi os. * come root?

La mia sceneggiatura

  1. esegue la scansione di alcune cartelle e file per verificare se è possibile eseguire il lavoro
  2. apporta alcune modifiche in / etc / ...
  3. 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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top