2009-08-21 15 views
7

He buscado en Google "python ssh". Hay un maravilloso módulo pexpect, que puede acceder a una computadora remota usando ssh (con contraseña).cómo obtener la salida de la consola desde una computadora remota (ssh + python)

Después de que la computadora remota está conectada, puedo ejecutar otros comandos. Sin embargo, no puedo obtener el resultado en Python nuevamente.

p = pexpect.spawn("ssh [email protected]_computer") 
print "connecting..." 
p.waitnoecho() 
p.sendline(my_password) 
print "connected" 
p.sendline("ps -ef") 
p.expect(pexpect.EOF) # this will take very long time 
print p.before 

¿Cómo obtener el resultado de ps -ef en mi caso?

+0

hmm? p.antes de dar la salida –

+0

python devuelve "Ninguno" – stanleyxu2005

Respuesta

1

También es posible que desee investigar paramiko que es otra biblioteca SSH para Python.

+0

Después de haber probado tantas soluciones diferentes, creo que esta biblioteca es la mejor práctica por el momento. Incluso no tengo que configurar el inicio de sesión sin contraseña para ejecutar ningún script en nodos externos a través de LAN. – stanleyxu2005

1

intenta enviar

p.sendline("ps -ef\n") 

IIRC, el texto que envíe se interpreta pie de la letra, por lo que el otro equipo es, probablemente, a la espera de que complete el comando.

8

¿Has probado un enfoque aún más simple?

>>> from subprocess import Popen, PIPE 
>>> stdout, stderr = Popen(['ssh', '[email protected]_computer', 'ps -ef'], 
...      stdout=PIPE).communicate() 
>>> print(stdout) 

Por supuesto, esto sólo funciona porque tengo ssh-agent marcha precargado con una clave privada que el host remoto conoce.

+1

Gracias por este consejo. ¿Hay alguna manera fácil de configurar claves privadas para muchos clientes? Tengo que verificar los archivos de registro de 20 máquinas cada semana. Esta es la motivación de escribir una secuencia de comandos python. – stanleyxu2005

+0

Bueno ... solo tendrá que agregar su clave pública a ~/.ssh/authorized_keys en cada una de las máquinas. Tal vez, si su conjunto de máquinas que trabajan no cambia mucho, este será un ejercicio de una sola vez. Por cierto, este es un artículo bastante prolijo sobre cómo configurar el Agente SSH y más: http://unixwiz.net/techtips/ssh-agent-forwarding.html –

3
child = pexpect.spawn("ssh [email protected]_computer ps -ef") 
print "connecting..." 
i = child.expect(['[email protected]_computer\'s password:']) 
child.sendline(user_password) 
i = child.expect([' .*']) #or use i = child.expect([pexpect.EOF]) 
if i == 0: 
    print child.after # uncomment when using [' .*'] pattern 
    #print child.before # uncomment when using EOF pattern 
else: 
    print "Unable to capture output" 


Hope this help.. 
Cuestiones relacionadas