linea - idle python
ejecutando un comando como superusuario desde una secuencia de comandos python (4)
Prueba a dar la ruta completa a apache2ctl.
Por lo tanto, estoy tratando de ejecutar un proceso como superusuario dentro de un script de Python usando un subproceso. En el shell ipython algo así como
proc = subprocess.Popen(''sudo apach2ctl restart'',
shell=True, stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
funciona bien, pero tan pronto como lo sudo: apach2ctl: command not found
en un script, empiezo a obtener: sudo: apach2ctl: command not found
.
Supongo que esto se debe a la forma en que sudo maneja los entornos en ubuntu. (También he probado sudo -E apche2ctl restart
y sudo env path=$PATH apache2ctl restart
sin resultado)
Así que mi pregunta es básicamente, si quiero ejecutar apache2ctl restart
como superusuario que solicita al usuario la contraseña del superusuario cuando sea necesario, ¿cómo debo hacer esto? No tengo intención de almacenar contraseñas en el script.
Editar:
He intentado pasar los comandos 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.
Editar 2:
Entonces, lo que encuentro es que mientras Popen trabajará con algunos comandos como cadenas cuando shell = True, se necesita
proc = subprocess.Popen([''sudo'',''/usr/sbin/apache2ctl'',''restart''])
sin ''shell = True'' para hacer que sudo funcione.
¡Gracias!
Tienes que usar Popen así:
cmd = [''sudo'', ''apache2ctl'', ''restart'']
proc = subprocess.Popen(cmd, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
Espera una lista.
Tratar:
subprocess.call([''sudo'', ''apach2ctl'', ''restart''])
El subproceso necesita acceder al stdin / out / err real para que pueda avisarle y leer su contraseña. Si los configura como tubos, necesita alimentar la contraseña en ese tubo usted mismo.
Si no los define, entonces toma sys.stdout, etc ...
Otra forma es hacer que su usuario sea un usuario sudo user
contraseña.
Escriba lo siguiente en la línea de comando:
sudo visudo
A continuación, agregue lo siguiente y reemplace el <username>
con el suyo:
<username> ALL=(ALL) NOPASSWD: ALL
Esto le permitirá al usuario ejecutar el comando sudo
sin tener que pedir una contraseña (incluida la aplicación lanzada por dicho usuario. Sin embargo, esto podría ser un riesgo de seguridad).