2009-08-21 7 views
7

Ho cercato su google "python ssh". C'è un meraviglioso modulo pexpect, che può accedere a un computer remoto usando ssh (con password).come ottenere l'output della console da un computer remoto (ssh + python)

Dopo aver connesso il computer remoto, posso eseguire altri comandi. Tuttavia non riesco a ottenere di nuovo il risultato in python.

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 

Come ottenere il risultato di ps -ef nel mio caso?

+0

hmm? p.before dovrebbe dare l'output –

+0

restituisce python "None" – stanleyxu2005

risposta

1

Si potrebbe anche voler esaminare paramiko che è un'altra libreria SSH per Python.

+0

Dopo aver provato così tante diverse soluzioni, penso che questa libreria sia la migliore pratica per ora. Non ho nemmeno bisogno di configurare l'accesso non-password per eseguire qualsiasi script su nodi stranieri su LAN. – stanleyxu2005

1

tenta di inviare

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

IIRC, il testo inviato viene interpretato alla lettera, così l'altro computer è probabilmente in attesa per completare il comando.

8

Hai provato un approccio ancora più semplice?

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

Certo, questo funziona solo perché ho ssh-agent esecuzione precaricato con una chiave privata che l'host remoto conosce.

+1

Grazie per questo suggerimento. C'è un modo semplice per configurare le chiavi private per molti clienti? Devo controllare i file di registro di 20 macchine ogni settimana. Questa è la motivazione per scrivere uno script python. – stanleyxu2005

+0

Bene ... dovrai solo aggiungere la tua chiave pubblica a ~/.ssh/authorized_keys su ciascuna delle macchine. Forse, se il tuo set di macchine da lavoro non cambia molto, questo sarà un esercizio di una volta. BTW, questo è un articolo abbastanza carino sulla configurazione di Agente SSH e altro: 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..