Comment puis-je simplement SSH sur un serveur distant à partir d'un script Python (3.0) local, fournir un identifiant/mot de passe, exécuter une commande et imprimer le résultat sur la console Python?
Je préférerais ne pas utiliser de grande bibliothèque externe ni installer quoi que ce soit sur le serveur distant.
Je ne l'ai pas essayé, mais ce module pysftp pourrait aider, qui à son tour utilise paramiko. Je crois que tout est côté client.
La commande intéressante est probablement .execute()
qui exécute une commande arbitraire sur la machine distante. (Le module comporte également des méthodes .get()
et .put
qui font davantage allusion à son caractère FTP).
METTRE À JOUR:
J'ai réécrit la réponse après que le billet de blog auquel je m'étais initialement lié ne soit plus disponible. Certains commentaires faisant référence à l'ancienne version de cette réponse auront maintenant un aspect bizarre.
Vous pouvez le coder vous-même en utilisant Paramiko, comme suggéré ci-dessus. Vous pouvez également utiliser Fabric, une application python pour faire tout ce que vous avez demandé:
Fabric est une bibliothèque Python et outil de ligne de commande conçu pour rationaliser le déploiement d'applications ou effectuer des tâches d'administration système via le protocole SSH. Il offre outils pour exécuter un shell arbitraire commandes (soit en tant que login utilisateur normal, soit via Sudo), téléchargement et téléchargement de fichiers, etc.
Je pense que cela correspond à vos besoins. Il ne s'agit pas non plus d'une bibliothèque volumineuse et ne nécessite aucune installation de serveur, même si elle a des dépendances sur paramiko et pycrypt qui nécessitent une installation sur le client.
L’application était ici . On peut maintenant le trouver ici .
* The official, canonical repository is git.fabfile.org
* The official Github mirror is GitHub/bitprophet/fabric
Il existe plusieurs bons articles à ce sujet, mais vous devez être prudent, car il a changé au cours des six derniers mois:
Déploiement de Django avec Fabric
Outils du pirate Python moderne: Virtualenv, Fabric and Pip
Déploiement simple et facile avec Fabric et Virtualenv
Plus tard: Paramiko n’est plus nécessaire pour Fabric:
$ pip install fabric
Downloading/unpacking fabric
Downloading Fabric-1.4.2.tar.gz (182Kb): 182Kb downloaded
Running setup.py Egg_info for package fabric
warning: no previously-included files matching '*' found under directory 'docs/_build'
warning: no files found matching 'fabfile.py'
Downloading/unpacking ssh>=1.7.14 (from fabric)
Downloading ssh-1.7.14.tar.gz (794Kb): 794Kb downloaded
Running setup.py Egg_info for package ssh
Downloading/unpacking pycrypto>=2.1,!=2.4 (from ssh>=1.7.14->fabric)
Downloading pycrypto-2.6.tar.gz (443Kb): 443Kb downloaded
Running setup.py Egg_info for package pycrypto
Installing collected packages: fabric, ssh, pycrypto
Running setup.py install for fabric
warning: no previously-included files matching '*' found under directory 'docs/_build'
warning: no files found matching 'fabfile.py'
Installing fab script to /home/hbrown/.virtualenvs/fabric-test/bin
Running setup.py install for ssh
Running setup.py install for pycrypto
...
Successfully installed fabric ssh pycrypto
Cleaning up...
C’est surtout cosmétique: ssh est une fourchette de paramiko, le responsable des deux bibliothèques est identique (Jeff Forcier, également auteur de Fabric), et le responsable envisage de réunir paramiko et ssh sous le nom de paramiko . (Cette correction via pbanka .)
Si vous souhaitez éviter des modules supplémentaires, vous pouvez utiliser le module de sous-processus pour exécuter
ssh [Host] [command]
et capturer la sortie.
Essayez quelque chose comme:
process = subprocess.Popen("ssh example.com ls", Shell=True,
stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
output,stderr = process.communicate()
status = process.poll()
print output
Pour gérer les noms d'utilisateur et les mots de passe, vous pouvez utiliser un sous-processus pour interagir avec le processus ssh ou vous pouvez installer une clé publique sur le serveur pour éviter l'invite du mot de passe.
J'ai écrit Python bindings pour libssh2 . Libssh2 est une bibliothèque côté client implémentant le protocole SSH2.
import socket
import libssh2
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('exmaple.com', 22))
session = libssh2.Session()
session.startup(sock)
session.userauth_password('john', '******')
channel = session.channel()
channel.execute('ls -l')
print channel.read(1024)
Votre définition de "plus simple" est importante ici - un code simple signifie utiliser un module (bien que "une grande bibliothèque externe" soit une exagération).
Je crois que le module le plus récent (développé activement) est paramiko . Il contient des scripts de démonstration dans le téléchargement et une documentation détaillée sur les API en ligne. Vous pouvez également essayer PxSSH , qui est contenu dans pexpect . Il y a un court échantillon avec la documentation au premier lien.
Toujours en ce qui concerne la simplicité, notez qu’une bonne détection des erreurs rendra votre code plus complexe, mais vous devriez pouvoir réutiliser une grande partie du code des exemples de scripts, puis l’oublier.
Comme le brun pâle, j'aime le tissu. Veuillez noter que, tout en implémentant son propre script déclaratif (pour effectuer des déploiements, etc.), il peut également être importé en tant que module Python et utilisé dans vos programmes sans avoir à écrire un script Fabric.
Fabric a un nouveau responsable et est en train d'être réécrit; cela signifie que la plupart des tutoriels que vous trouverez (actuellement) sur le Web ne fonctionneront pas avec la version actuelle. Google affiche toujours l'ancienne page Fabric en premier résultat.
Pour une documentation à jour, vous pouvez vérifier: http://docs.fabfile.org
J'ai trouvé que paramiko était un peu trop bas et Fabric ne convenant pas vraiment à être utilisé comme bibliothèque. J'ai donc créé ma propre bibliothèque appelée spur qui utilise paramiko pour implémenter une interface légèrement plus agréable:
import spur
Shell = spur.SshShell(hostname="localhost", username="bob", password="password1")
result = Shell.run(["echo", "-n", "hello"])
print result.output # prints hello
Vous pouvez également choisir d'imprimer la sortie du programme pendant son exécution, ce qui est utile si vous souhaitez voir la sortie des commandes à exécution longue avant sa fermeture:
result = Shell.run(["echo", "-n", "hello"], stdout=sys.stdout)
Pour le bénéfice de ceux qui arrivent ici googler pour un échantillon de python ssh ... La question et la réponse d'origine sont presque un vieux décodage maintenant ... Il semble que le paramiko ait gagné un peu de fonctionnalités je ne connais que très peu de Python) et vous pouvez créer un client ssh directement avec paramiko.
import base64
import paramiko
client = paramiko.SSHClient()
client.set_missing_Host_key_policy(paramiko.AutoAddPolicy())
client.connect('192.168.1.1', username='user', password='password')
stdin, stdout, stderr = client.exec_command('cat /proc/meminfo')
for line in stdout:
print('... ' + line.strip('\n'))
client.close()
Ce code a été adapté de la démo de https://github.com/paramiko/paramiko Il fonctionne pour moi.
Cela a fonctionné pour moi
import subprocess
import sys
Host="IP"
COMMAND="ifconfig"
def passwordless_ssh(Host):
ssh = subprocess.Popen(["ssh", "%s" % Host, COMMAND],
Shell=False,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
result = ssh.stdout.readlines()
if result == []:
error = ssh.stderr.readlines()
print >>sys.stderr, "ERROR: %s" % error
return "error"
else:
return result
please refer to paramiko.org, its very useful while doing ssh using python.
importer paramiko
temps d'importation
ssh = paramiko.SSHClient () #SSHClient () est l'objet paramiko
'' 'Au-dessous des lignes ajoute la clé du serveur automatiquement au fichier know_hosts. Utilisez l'un des éléments ci-dessous' ''
ssh.set_missing_Host_key_policy (paramiko.AutoAddPolicy ())
essayer:
ssh.connect('10.106.104.24', port=22, username='admin', password='')
time.sleep(5)
I have mentioned time because some servers or endpoint prints there own information after loggin in e.g. the version, model and uptime information, so its better to give some time before executing the command.
Here we execute the command, stdin for input, stdout for output, stderr for error
stdin, stdout, stderr = ssh.exec_command('xstatus Time')
output = stdout.readlines()
print(output)
Below all are the Exception handled by paramiko while ssh. Refer to paramiko.org for more information about exception.
sauf (BadHostKeyException, AuthenticationException,
SSHException, socket.error) comme e:
print(e)
Jetez un œil à spurplus , une enveloppe autour de spur et paramiko que nous avons développée pour gérer les ordinateurs distants et effectuer des opérations sur les fichiers.
Spurplus fournit une fonction check_output()
prête à l'emploi:
import spurplus
with spurplus.connect_with_retries(
hostname='some-machine.example.com', username='devop') as Shell:
out = Shell.check_output(['/path/to/the/command', '--some_argument'])
print(out)