2009-08-21 5 views
7

J'ai scanné "python ssh". Il y a un merveilleux module pexpect, qui peut accéder à un ordinateur distant en utilisant ssh (avec mot de passe). Une fois l'ordinateur distant connecté, je peux exécuter d'autres commandes.comment obtenir la sortie de la console à partir d'un ordinateur distant (ssh + python)

Cependant, je ne peux pas obtenir le résultat en python à nouveau.

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 

Comment obtenir le résultat de ps -ef dans mon cas?

+0

hmm? p.before devrait donner la sortie –

+0

python retourne "None" – stanleyxu2005

Répondre

1

Vous pouvez également rechercher paramiko qui est une autre bibliothèque SSH pour Python.

+0

Après avoir essayé tant de solutions différentes, je pense que cette bibliothèque est la meilleure pratique pour l'instant. Je n'ai même pas besoin de configurer une connexion sans mot de passe pour exécuter un script sur des nœuds étrangers sur un réseau local. – stanleyxu2005

1

Essayez d'envoyer

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

IIRC, le texte que vous envoyez est interprété textuellement, que l'autre ordinateur attend probablement pour vous de compléter la commande.

8

Avez-vous essayé une approche encore plus simple?

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

Certes, cela ne fonctionne que parce que j'ai ssh-agent en cours d'exécution préchargé avec une clé privée que l'hôte distant connaît.

+1

Merci pour ce conseil. Existe-t-il un moyen facile de configurer des clés privées pour de nombreux clients? Je dois vérifier les fichiers journaux de 20 machines chaque semaine. C'est la motivation de l'écriture d'un script python. – stanleyxu2005

+0

Eh bien ... il vous suffira d'ajouter votre clé publique à ~/.ssh/authorized_keys sur chacune des machines. Peut-être, si votre jeu de machines ne change pas beaucoup, ce sera un exercice ponctuel. BTW, c'est un article assez soigné sur la configuration de l'agent SSH et plus: 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.. 
Questions connexes