J'essaie de commencer avec la bibliothèque Paramiko, mais la bibliothèque lève une exception dès que j'essaie de me connecter avec le programme simple suivant:
import paramiko
ssh = paramiko.SSHClient()
ssh.connect('127.0.0.1', username='boatzart', password='mypassword')
L'erreur que j'obtiens est:
Traceback (most recent call last):
File "test.py", line 6, in <module>
ssh.connect('127.0.0.1')
File "build/bdist.macosx-10.7-intel/Egg/paramiko/client.py", line 316, in connect
File "build/bdist.macosx-10.7-intel/Egg/paramiko/client.py", line 85, in missing_Host_key
paramiko.SSHException: Unknown server 127.0.0.1
Cela se produit quel que soit le serveur que j'essaie.
L'exception a été déclenchée car il vous manque une clé d'hôte, le "serveur inconnu" plutôt cryptique est l'indice - puisque l'exception a été déclenchée à partir de missing_Host_key
Essayez plutôt ceci:
import paramiko
paramiko.util.log_to_file('ssh.log') # sets up logging
client = paramiko.SSHClient()
client.load_system_Host_keys()
client.connect('127.0.0.1', username=username, password=password)
stdin, stdout, stderr = client.exec_command('ls -l')
J'ai rencontré le même problème et voici la solution qui a fonctionné pour moi:
import paramiko
client = paramiko.SSHClient()
client.set_missing_Host_key_policy(paramiko.AutoAddPolicy())
client.connect('127.0.0.1', username=username, password=password)
stdin, stdout, stderr = client.exec_command('ls -l')
Il s'agit de définir la stratégie à utiliser lors de la connexion à un serveur qui n'a pas de clé d'hôte dans le système ou les objets HostKeys locaux. La stratégie par défaut consiste à rejeter tous les serveurs inconnus (à l'aide de RejectPolicy). Vous pouvez remplacer AutoAddPolicy ou écrire votre propre classe de règles.
Plus de détails sur paramiko api doc . J'espère que cela t'aides.
J'ai rencontré ce problème et je voulais publier une solution de contournement ici. Le problème était en effet le serveur ssh envoyant des clés ecdsa, qui ne sont pas (encore) supportées par paramiko. Sur mon système Debian Wheezy, j'ai désactivé ecdsa en commentant une seule ligne dans/etc/ssh/sshd_config:
# HostKey/etc/ssh/ssh_Host_ecdsa_key
Redémarrage de sshd et retour à l'utilisation de RSA. Il y avait des clés ecdsa dans mon fichier known_hosts, je l'ai donc supprimé pour réinitialiser et je me suis connecté manuellement pour recréer les clés. À partir de là, paramiko a parfaitement fonctionné comme prévu, avec la vérification des clés de l'hôte RSA.
J'ai eu cette erreur: je peux me connecter à partir du shell, mais paramiko dit "workdevel114 du serveur inconnu".
Il y avait deux entrées similaires dans known_hosts:
user@Host> grep workdevel114 ~/.ssh/known_hosts
workdevel114 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQC8qGbuI1BaBodi7sKWLfV8Eh+De80Th7HFLD4WiJWo57THl0Q+QcopUaU3pF....
user@Host> grep I1BaBodi7sKWLfV8Eh+De80Th7HFLD4WiJWo57THl0Q+QcopUaU3pF ~/.ssh/known_hosts
workdevel114 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQC8qGbuI1BaBodi7sK...
|1|f/auQ9nY5dFbVtOdY3ocjtVO9dM=|esvazUDTT3VIcLk9DxmPI6FZt1s= ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQC8qGbuI1BaBodi7sKWLfV8Eh+De80Th7HFLD4...
L'entrée des secondes (| 1 | ....) semble confondre paramiko. Je suppose que c'est lié à ce ticket: https://github.com/paramiko/paramiko/issues/67
Je l'ai résolu en ajoutant cette ligne:
client.set_missing_Host_key_policy(paramiko.AutoAddPolicy())
Mais cela désactive la vérification par l'hôte du protocole ssh dans ce cas: Paramiko pense que la clé Host est inconnue, mais elle est connue. La clé connue est ignorée. Je m'en fiche parce que les attaques d'homme au milieu sont très peu probables dans mon environnement.
version paraiko: 1.7.7.1-1ubuntu1
La bonne façon est soit:
Appelez le HostKeys.add
sur l'instance retournée par SSHClient.get_Host_keys
avant d'appeler le connect
, en lui passant la clé de confiance.
from base64 import decodebytes
# ...
keydata = b"""AAAAB3NzaC1yc2EAAAADAQAB..."""
key = paramiko.RSAKey(data=decodebytes(keydata))
client.get_Host_keys().add('example.com', 'ssh-rsa', key)
Pour voir comment obtenir l'empreinte digitale à utiliser dans le code, consultez ma réponse à:
Vérifier la clé d'hôte avec pysftp .
Si vous ne connaissez qu'une empreinte digitale, voir:
Python - pysftp/paramiko - Vérifier la clé hôte à l'aide de son empreinte digitale
Ou chargez la clé d'hôte déjà mise en cache (par exemple par la ligne de commande ssh
) en utilisant client.load_system_Host_keys()
.
Ou vous pouvez au moins mettre en cache la clé d'hôte dès la première tentative pour vous assurer qu'elle ne changera pas à l'avenir.
Pour cela, utilisez SSHClient.load_Host_keys
avant connect
. Cela fait que Paramiko ajoute automatiquement la nouvelle clé Host au fichier (lorsqu'il est combiné avec AutoAddPolicy
).