2012-05-20 57 views
26

我想开始使用的paramiko库,但我尝试用下面简单的程序连接库尽快抛出一个异常:的paramiko“未知服务器”

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

错误我得到的是:

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 

无论我尝试使用哪个服务器,都会发生这种情况。

回答

22

,因为你缺少一个主机密钥的异常升高,相当神秘的“未知服务器”为线索 - 因为除了从missing_host_key

提出试试这个:

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

我经历了同样的问题,下面是摸索出适合我的解决方案:

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

这是设置政策连接到服务器时使用在系统或本地HostKeys对象中没有主机密钥。默认策略是拒绝所有未知服务器(使用RejectPolicy)。您可以用AutoAddPolicy替代或编写自己的策略类。

更多详情,请登录paramiko api doc。希望这可以帮助。

+1

它的工作原理,我也这样做,但值得一提的是,你自动信任目标机器,并在技术上暴露给中间人攻击。只需提出警告! – F1Rumors

+0

它的工作原理。我在windows10上测试过 – wazhao

+0

'AutoAddPolicy()'是否将host_key添加到known_hosts。因此,这是在下次运行时,我可以删除'set_missing_host_key_policy()',只是用'load_system_host_keys()'? – nidHi

5

我有这个错误:我可以从shell连接,但paramiko说“未知服务器workdevel114”。

有在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... 

的秒进入(| 1 | ....)似乎混淆的paramiko。我想这是与此相关的机票:https://github.com/paramiko/paramiko/issues/67

我解决它通过加入这一行:

client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 

但这禁止在这种情况下的SSH协议的主机检查:的paramiko认为主机密钥是未知,但它是已知的。已知的密钥被忽略。我不在乎,因为在我的环境中,中间人攻击是不太可能的。

paraiko版本:1.7.7.1-1ubuntu1

+0

我知道这是一个古老的线程,但加入“set_missing_host_key_policy”解决我的问题,如使用“load_system_host_keys”还不够 – ton

6

我遇到过这个问题,并希望在这里发表一个解决方法。这个问题确实是ssh服务器发送ecdsa密钥,这在paramiko中还不被支持。在我的Debian喘息系统I残疾人ECDSA注释掉在/ etc/SSH/sshd_config的一行:

#HostKey的/ etc/SSH/ssh_host_ecdsa_key

重新启动的sshd的,这是回使用RSA。在我的known_hosts文件中有一些ecdsa键,所以我刚删除它重置,并手动登录重新创建键。从那里,paramiko完美地按预期工作,并通过RSA主机密钥检查。

+0

感谢让我们知道,也发生在我身上并且应用了相同的解决方案! – zenperttu

2

正确的方法可以是:

  • 呼吁通过SSHClient.get_host_keys返回的实例HostKeys.add调用connect,将其传递到可信的密钥之前。

    keydata = b"""AAAAB3NzaC1yc2EAAAADAQAB...""" 
    key = paramiko.RSAKey(data=decodebytes(keydata)) 
    client.get_host_keys().add('example.com', 'ssh-rsa', key) 
    
  • 或负载的已缓存hostkey(例如,通过命令行ssh)使用client.load_system_host_keys()

  • 或者至少可以从第一次尝试缓存hostkey,以确保它不会改变未来。

    对于connect之前使用SSHClient.load_host_keys。它使Paramiko自动将新的主机密钥添加到文件中(与AutoAddPolicy结合使用时)。

相关问题