programa linea interprete idle ejecutar desde cómo consola comandos archivos archivo python subprocess sudo

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).