10
votes

Comment obtenir la sortie de la console d'un ordinateur distant (SSH + Python)

J'ai Googled "Python Ssh". Il y a un magnifique 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. Cependant, je ne peux plus chercher à Python. xxx

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


1 commentaires

Hmm? p. avant devrait donner la sortie


4 Réponses :


1
votes

Essayez d'envoyer

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


0 commentaires

1
votes

Vous voudrez peut-être également enquêter sur Paramiko qui est une autre bibliothèque SSH pour Python.


1 commentaires

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 à configurer la connexion sans mot de passe pour exécuter un script sur des nœuds étrangers sur le réseau local.



10
votes

Avez-vous essayé une approche encore plus simple?

>>> from subprocess import Popen, PIPE
>>> stdout, stderr = Popen(['ssh', 'user@remote_computer', 'ps -ef'],
...                        stdout=PIPE).communicate()
>>> print(stdout)


2 commentaires

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.


Eh bien ... vous devrez ajouter votre clé publique à ~ / .SSH / Authorize_keys sur chacune des machines. Peut-être que si votre ensemble de machines ne change pas beaucoup, cela constituera un exercice unique. BTW, il s'agit d'un autre article soigné sur la mise en place d'un agent SSH et de plus: Unixwiz.net/ TechTips / SSH-Agent-Forwarding.html



3
votes
child = pexpect.spawn("ssh user@remote_computer ps -ef")
print "connecting..."
i = child.expect(['user@remote_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..

0 commentaires