Por lo tanto, estoy tratando de ejecutar un proceso como superusuario dentro de una secuencia de comandos python utilizando subprocesos. En el shell ipython algo así comoejecutando un comando como superusuario desde una secuencia de comandos python
proc = subprocess.Popen('sudo apach2ctl restart',
shell=True, stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
trabaja muy bien, pero tan pronto como lo pego en un guión que comienza a recibir: sudo: apach2ctl: command not found
.
Supongo que esto se debe a la forma en que sudo maneja los entornos en ubuntu. (También he intentado sudo -E apche2ctl restart
y sudo env path=$PATH apache2ctl restart
sin resultado)
Así que mi pregunta es, básicamente, si quiero correr apache2ctl restart
como super usuario que solicita al usuario la contraseña de superusuario cuando sea necesario, ¿cómo debo ir haciendo ¿esta? No tengo intención de almacenar contraseñas en el script.
Editar:
He intentado pasar en los comandos tanto como una cadena y tokenizados en una lista. En el intérprete de Python, con una cadena obtendré la solicitud de contraseña correctamente (todavía no funciona en un script de Python como en mi problema original), una lista solo da la pantalla de ayuda para sudo.
Edición 2:
Así que lo que tengo entendido es que mientras Popen trabajará con algunos comandos simplemente como cadenas cuando el shell = True, se necesita
proc = subprocess.Popen(['sudo','/usr/sbin/apache2ctl','restart'])
sin 'shell = True' para obtener sudo trabajar.
Gracias!
¿Qué hay de la configuración de sudo para que este usuario pueda ejecutar solo este comando sin necesidad de una contraseña? –
Es posible que desee usar ['proc.wait()'] (https://docs.python.org/2/library/subprocess.html#subprocess.Popen.wait) según lo que esté haciendo; 'wait' no continúa hasta que el proceso hijo haya terminado de ejecutarse. – craymichael