的paramiko“未知服务器”的paramiko“未知服务器”(Paramiko “Unknown

2019-05-14 08:47发布

我想开始使用的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

出现这种情况不管我的服务器。

Answer 1:

在异常发生,因为你缺少一个主键,而神秘的“未知服务器”为线索-因为除了从提出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')


Answer 2:

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

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文档 。 希望这可以帮助。



Answer 3:

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

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

秒条目(| 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



Answer 4:

我遇到过这个问题,并希望在这里发表一个解决方法。 这个问题的确是SSH服务器发送ECDSA密钥,这是不支持(还)具有的paramiko。 在我的Debian喘息系统我注释掉一行禁用ECDSA在/ etc / SSH / sshd_config中:

#HostKey的/ etc / SSH / ssh_host_ecdsa_key

重新启动sshd的,这是回使用RSA。 有在我的known_hosts一些ECDSA密钥文件,所以我刚刚删除它复位和手动登录到重建的关键。 从那里,完美的paramiko担任预期,RSA主机密钥检查。



Answer 5:

正确的方法可以是:

  • 调用HostKeys.add通过返回的实例SSHClient.get_host_keys调用之前connect ,传递信任的关键。

     from base64 import decodebytes # ... keydata = b"""AAAAB3NzaC1yc2EAAAADAQAB...""" key = paramiko.RSAKey(data=decodebytes(keydata)) client.get_host_keys().add('example.com', 'ssh-rsa', key) 

    要了解如何获取指纹的使用代码,请参阅我的回答:
    验证与pysftp主机密钥 。

  • 或加载已经缓存hostkey(例如,通过命令行ssh使用) client.load_system_host_keys()

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

    对于使用SSHClient.load_host_keysconnect 。 它使的paramiko自动添加新的主机密钥文件(当联合AutoAddPolicy )。



文章来源: Paramiko “Unknown Server”