33

我正在尝试开始使用 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

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

4

5 回答 5

73

我遇到了同样的问题,这是对我有用的解决方案:

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

之后,您可以保存到另一个密钥文件文件中以供下次使用,如下所示。

ssh.get_host_keys().save('/some/file/path')

您始终可以按如下方式从文件加载。

ssh.load_host_keys('/some/file/path')
于 2012-07-25T07:01:56.780 回答
28

引发异常是因为您缺少主机密钥,相当神秘的“未知服务器”是线索 - 因为异常是从引发的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')
于 2012-05-20T06:33:14.853 回答
18

正确的方法是:

于 2017-03-29T12:44:23.910 回答
7

我遇到了这个问题,想在这里发布一个解决方法。问题确实是 ssh 服务器发送 ecdsa 密钥,paramiko 不支持(尚)。在我的 debian Wheezy 系统上,我通过在 /etc/ssh/sshd_config 中注释掉一行来禁用 ecdsa:

# 主机密钥 /etc/ssh/ssh_host_ecdsa_key

重新启动 sshd,它又回到了使用 RSA。我的 known_hosts 文件中有一些 ecdsa 密钥,所以我只是将其删除以重置,然后手动登录以重新创建密钥。从那里开始,通过 RSA 主机密钥检查,paramiko 按预期完美运行。

于 2013-06-28T15:50:11.417 回答
6

我遇到了这个错误:我可以从 shell 连接,但 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 认为主机密钥是未知的,但它是已知的。已知的 Key 被忽略。我不在乎,因为在我的环境中不太可能发生中间人攻击。

paraiko 版本:1.7.7.1-1ubuntu1

于 2012-09-07T12:16:01.820 回答