Quindi sto cercando di ottenere un processo da eseguire come super utente da uno script python utilizzando il sottoprocesso. Nella shell ipython qualcosa comeesecuzione di un comando come super utente da uno script python
proc = subprocess.Popen('sudo apach2ctl restart',
shell=True, stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
funziona bene, ma non appena mi attengo in uno script che ho iniziare a ricevere: sudo: apach2ctl: command not found
.
Direi che questo è dovuto al modo in cui sudo gestisce gli ambienti su ubuntu. (Ho anche provato sudo -E apche2ctl restart
e sudo env path=$PATH apache2ctl restart
con inutilmente)
Quindi la mia domanda è sostanzialmente, se voglio correre apache2ctl restart
come super utente che richiede all'utente di inserire la password di super utente quando richiesto, come dovrei andare a fare Questo? Non ho intenzione di memorizzare le password nello script.
Edit:
ho provato passando i comandi come sia una stringa e token in una lista. Nell'interprete python, con una stringa otterrò il prompt della password correttamente (ancora non funziona in uno script python come nel mio problema originale), una lista dà solo la schermata di aiuto per sudo.
Edit 2:
Quindi quello che ho capito è che, mentre Popen lavorerà con alcuni comandi proprio come corde quando shell = True, ci vuole
proc = subprocess.Popen(['sudo','/usr/sbin/apache2ctl','restart'])
senza 'shell = True' per ottenere sudo lavorare.
Grazie!
Come configurare sudo in modo che questo utente possa eseguire solo questo comando senza richiedere una password? –
Si potrebbe voler usare ['proc.wait()'] (https://docs.python.org/2/library/subprocess.html#subprocess.Popen.wait) a seconda di cosa si sta facendo; 'wait' non procede fino a quando il processo figlio non ha finito di funzionare. – craymichael