2012-05-20 17 views
26

que estoy tratando de empezar a trabajar con la biblioteca paramiko, pero la biblioteca es una excepción en cuanto me intento conectar con el siguiente programa simple:paramiko "Servidor desconocido"

import paramiko 
ssh = paramiko.SSHClient() 
ssh.connect('127.0.0.1', username='boatzart', password='mypassword') 

El error que obtener es:

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 

Esto ocurre independientemente del servidor que intento.

Respuesta

22

La excepción fue levantado porque se echa en falta una clave de host, el más críptico "El servidor no" es la clave - ya que la excepción fue levantado de missing_host_key

Tal vez puedas probar:

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') 
71

I experimentado el mismo problema y aquí está la solución que funcionó para mí:

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') 

esto es establecer la política para usar cuando se conecta a un servidor que no tiene una clave de host en el sistema ni en los objetos HostKeys locales. La política predeterminada es rechazar todos los servidores desconocidos (utilizando RejectPolicy). Puede sustituir AutoAddPolicy o escribir su propia clase de política.

Más detalles en paramiko api doc. Espero que esto ayude.

+1

Funciona, y yo también lo hago, pero vale la pena mencionar que confías automáticamente en la máquina objetivo y que estás técnicamente expuesto al hombre en los ataques intermedios. Solo por mencionar la advertencia! – F1Rumors

+0

Funciona. Probé en Windows10 – wazhao

+0

¿'AutoAddPolicy()' agrega la clave host a los known_hosts. Entonces, la próxima vez que se ejecute ¿puedo eliminar el 'set_missing_host_key_policy()' y simplemente usar 'load_system_host_keys()'? – nidHi

5

Tuve este error: puedo conectarme desde el shell, pero paramiko dice "Servidor desconocido workdevel114".

Había dos entradas similares en known_hosts:

[email protected]> grep workdevel114 ~/.ssh/known_hosts 
workdevel114 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQC8qGbuI1BaBodi7sKWLfV8Eh+De80Th7HFLD4WiJWo57THl0Q+QcopUaU3pF.... 
[email protected]> grep I1BaBodi7sKWLfV8Eh+De80Th7HFLD4WiJWo57THl0Q+QcopUaU3pF ~/.ssh/known_hosts 
workdevel114 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQC8qGbuI1BaBodi7sK... 
|1|f/auQ9nY5dFbVtOdY3ocjtVO9dM=|esvazUDTT3VIcLk9DxmPI6FZt1s= ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQC8qGbuI1BaBodi7sKWLfV8Eh+De80Th7HFLD4... 

La entrada segundos (| 1 | ....) parece confundir paramiko. Creo que está relacionado con este billete: https://github.com/paramiko/paramiko/issues/67

Lo resuelto mediante la adición de esta línea:

client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 

Pero esto desactiva anfitrión comprobación del protocolo ssh en este caso: paramiko piensa que la clave de host es desconocida , pero se sabe. La clave conocida se ignora. No me importa porque los ataques de hombre en el medio son muy improbables en mi entorno.

paraikos-version: 1.7.7.1-1ubuntu1

+0

Sé que esto es un viejo hilo, pero añadiendo "set_missing_host_key_policy" resuelto mi problema, como el uso de "load_system_host_keys" no fue suficiente – ton

6

me encontré con este tema y quería publicar una solución aquí. El problema era, de hecho, que el servidor ssh enviaba claves ecdsa, que no son compatibles (todavía) con paramiko. En mi sistema Debian Wheezy que ECDSA deshabilitados comentando una sola línea en/etc/ssh/sshd_config:

# HostKey/etc/ssh/ssh_host_ecdsa_key

sshd reiniciado, y fue de nuevo a usar RSA. Había algunas claves ecdsa en mi archivo known_hosts, así que simplemente las eliminé para restablecerlas, y me registré manualmente para volver a crear las claves. A partir de ahí, paramiko funcionó perfectamente como se esperaba, con la comprobación de claves de host de RSA.

+0

gracias por permitirme nosotros sabemos, me pasó a mí también y se aplicó la misma solución! – zenperttu

2

La forma correcta es ya sea:

  • Llame al HostKeys.add en la instancia devuelta por SSHClient.get_host_keys antes de llamar al connect, pasándole la clave de confianza.

    keydata = b"""AAAAB3NzaC1yc2EAAAADAQAB...""" 
    key = paramiko.RSAKey(data=decodebytes(keydata)) 
    client.get_host_keys().add('example.com', 'ssh-rsa', key) 
    
  • o cargar la clave sshd ya en caché (por ejemplo, mediante la línea de comandos ssh) usando client.load_system_host_keys().

  • O al menos puede almacenar en caché la clave sshd desde el primer intento para asegurarse de que no cambia en el futuro.

    Para que el uso SSHClient.load_host_keys antes connect. Hace que Paramiko agregue automáticamente la nueva clave de host al archivo (cuando se combina con AutoAddPolicy).