2012-05-20 15 views
26

Sto cercando di iniziare con la libreria paramiko, ma la biblioteca è un'eccezione, non appena provo a collegarlo con il seguente programma semplice:paramiko "Sconosciuto Server"

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

L'errore che get is:

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 

Ciò si verifica indipendentemente dal server che provo.

risposta

22

L'eccezione è stata sollevata perché ti manca un tasto host, piuttosto criptico "server sconosciuto" è l'indizio - dal momento che l'eccezione è stata sollevata da missing_host_key

Prova a modificare:

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 sperimentato lo stesso problema ed ecco la soluzione che ha funzionato per me:

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

questo è quello di impostare il criterio da utilizzare per la connessione a un server che non ha una chiave host nel sistema o oggetti HostKeys locali. La politica di default è di rifiutare tutti i server sconosciuti (usando RejectPolicy). È possibile sostituire AutoAddPolicy o scrivere la propria classe politica.

Maggiori dettagli allo paramiko api doc. Spero che questo ti aiuti.

+1

Funziona, e lo faccio anch'io, ma vale la pena menzionare che si sta affidando la macchina di destinazione e tecnicamente esposti agli attacchi dell'uomo nel mezzo. Solo per citare l'avvertenza! – F1Rumors

+0

Funziona. Ho provato su windows10 – wazhao

+0

'AutoAddPolicy()' aggiunge la chiave_host ai server noti_hosts. Quindi la prossima volta che viene eseguito posso rimuovere 'set_missing_host_key_policy()' e usare solo 'load_system_host_keys()'? – nidHi

5

Ho avuto questo errore: posso connettermi dalla shell, ma paramiko dice "Unknown server workdevel114".

C'erano due voci simili a 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... 

L'entrata secondi (1 | ....) sembra confondere paramiko. Credo che sia correlato a questo biglietto: https://github.com/paramiko/paramiko/issues/67

ho risolto con l'aggiunta di questa linea:

client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 

Ma questo disabilita host-verifica del protocollo SSH, in questo caso: paramiko pensa che la chiave host è sconosciuto , ma è noto. La chiave conosciuta viene ignorata. Non mi interessa perché gli attacchi man-in-the-middle sono molto improbabili nel mio ambiente.

paraiko-versione: 1.7.7.1-1ubuntu1

+0

So che questa è una vecchia discussione ma l'aggiunta di "set_missing_host_key_policy" ha risolto il mio problema, poiché l'utilizzo di "load_system_host_keys" non era sufficiente – ton

6

ho incontrato questo problema e ha voluto inviare una soluzione qui. Il problema era in effetti il ​​server ssh che inviava le chiavi ecdsa, che non sono ancora supportate (con) da paramiko. Sul mio sistema Debian Wheezy I ecdsa disabile commentando una singola linea in/etc/ssh/sshd_config:

# HostKey/etc/ssh/ssh_host_ecdsa_key

sshd rimesso in moto, ed è stato di nuovo a usando RSA. C'erano alcune chiavi ecdsa nel mio file known_hosts, quindi l'ho appena cancellato per resettare e loggato manualmente per ricreare le chiavi. Da lì, paramiko ha funzionato perfettamente come previsto, con il controllo della chiave host RSA.

+0

grazie per aver lasciato Sappiamo, è successo anche a me e la stessa soluzione applicata! – zenperttu

2

Il modo corretto è uno:

  • chiamata la HostKeys.add nell'istanza restituito da SSHClient.get_host_keys prima di chiamare il connect, passandogli la chiave attendibile.

    keydata = b"""AAAAB3NzaC1yc2EAAAADAQAB...""" 
    key = paramiko.RSAKey(data=decodebytes(keydata)) 
    client.get_host_keys().add('example.com', 'ssh-rsa', key) 
    
  • Oppure caricare il hostkey già cache (ad esempio mediante la linea di comando ssh) utilizzando client.load_system_host_keys().

  • Oppure è possibile memorizzare almeno la chiave host dal primo tentativo per assicurarsi che non cambi in futuro.

    Per tale uso SSHClient.load_host_keys prima di connect. Fa in modo che Paramiko aggiunga automaticamente la nuova chiave host al file (se combinato con AutoAddPolicy).

Problemi correlati