2008-10-23 12 views
5

Escribo una secuencia de comandos python que ejecuta una secuencia de comandos csh en Solaris 10. La secuencia de comandos csh solicita al usuario la contraseña de root (que yo sé) pero no estoy seguro de cómo para hacer que el script python responda el mensaje con la contraseña. es posible? Esto es lo que estoy usando para ejecutar el script csh:Hacer que python ingrese la contraseña al ejecutar una secuencia de comandos csh

import commands 

commands.getoutput('server stop') 
+0

Había omitido PIPE, la nueva versión funciona ... –

+0

Primera vez para ver los comandos en uso. Por cierto: puede usar el módulo getpass para obtener una contraseña de la línea de comando sin mostrarla. – monkut

+1

[Enlace obligatorio] (http://www.perl.com/doc/FMTEYEWTK/versus/csh.whynot) –

Respuesta

7

Eche un vistazo al módulo pexpect. Está diseñado para tratar con programas interactivos, que parece ser su caso.

Ah, y recuerda que la contraseña difíciles de codificación de la raíz en un script de shell o pitón es potencialmente un agujero de seguridad: D

+0

Sí, pexpect era el camino a seguir ... Publiqué la respuesta al final de este hilo. – darrickc

0

Debería poder pasarlo como parámetro. algo como:

commands.getoutput('server stop -p password') 
+0

nuestro script de detención del servidor no tiene un indicador -p y probablemente no obtenga uno. – darrickc

3

Utilice subprocess. Llame a Popen() para crear su proceso y use communication() para enviarlo. Lo sentimos, se olvidó de incluir el TUBO ..

from subprocess import Popen, PIPE 

proc = Popen(['server', 'stop'], stdin=PIPE) 

proc.communicate('password') 

te sería mejor no evitar la contraseña e intentar un esquema como sudo y sudoers. Pexpect, mencionado en otra parte, no es parte de la biblioteca estándar.

+0

Esto no parece funcionar. Sin embargo, continuaré investigando Popen. – darrickc

+2

Obtengo la misma respuesta cuando uso el PIPE como lo recomienda aquí. La secuencia de comandos se detiene con el mensaje Contraseña: – darrickc

+0

No creo que esto funcione porque la secuencia de comandos csh hace exec su raíz -c "$ cmd0 $ *" para intentar su en la raíz. El su sería un proceso diferente al script 'server stop'. – darrickc

0

Esto parece funcionar mejor:

import popen2 

(stdout, stdin) = popen2.popen2('server stop') 

stdin.write("password") 

Pero todavía no es 100%. A pesar de que "password" es la contraseña correcta, sigo obteniendo su: lo siento nuevamente desde el script csh cuando está tratando de su para rootear.

+0

Creo que invirtió stdin y stdout. –

+0

No, de API: devuelve los objetos de archivo (child_stdout, child_stdin) – darrickc

+0

Solo algunos FYI - popen2 están "En desuso desde la versión 2.6: Este módulo está obsoleto. Use el módulo de subproceso. Consulte especialmente Reemplazo de funciones anteriores con el subproceso Módulo sección." – monkut

0

Para evitar tener que responder a la pregunta de contraseña en el script en Python que sólo voy a correr el script como root Esta pregunta aún no ha sido respondida, pero supongo que lo haré de esta manera por ahora.

+1

¿Podría limpiar y consolidar sus respuestas? – Roman

1
import pexpect 
child = pexpect.spawn('server stop') 
child.expect_exact('Password:') 

child.sendline('password') 

print "Stopping the servers..." 

index = child.expect_exact(['Server processes successfully stopped.', 'Server is not running...'], 60) 
child.expect(pexpect.EOF) 

Hicieron el truco! ¡Pexpect gobierna!

0

Agregue input= en proc.communicate() haga que funcione, para chicos a quienes les gusta usar lib estándar.

from subprocess import Popen, PIPE 
proc = Popen(['server', 'stop'], stdin=PIPE) 
proc.communicate(input='password') 
Cuestiones relacionadas