帕拉米科“未知服务器”
Posted
技术标签:
【中文标题】帕拉米科“未知服务器”【英文标题】:Paramiko "Unknown Server" 【发布时间】:2012-05-27 01:35:15 【问题描述】:我正在尝试开始使用 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
无论我尝试哪个服务器,都会发生这种情况。
【问题讨论】:
【参考方案1】:我遇到了同样的问题,这是为我解决的解决方案:
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。希望这会有所帮助。
【讨论】:
它有效,我也这样做,但值得一提的是,您自动信任目标机器并且在技术上暴露于中间人攻击。只是提一下警告!AutoAddPolicy()
是否将 host_key 添加到 known_hosts。所以下次运行时我可以删除set_missing_host_key_policy()
并只使用load_system_host_keys()
吗?
@nidHi 仅当您通过调用SSHClient.load_host_keys
提前告诉它从何处加载密钥时。见my answer【参考方案2】:
引发异常是因为您缺少主机密钥,相当神秘的“未知服务器”是线索 - 因为异常是从 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')
【讨论】:
【参考方案3】:正确的方法是:
在调用connect
之前,在SSHClient.get_host_keys
返回的实例上调用HostKeys.add
,将可信密钥传递给它。
from base64 import decodebytes
# ...
keydata = b"""AAAAB3NzaC1yc2EAAAADAQAB..."""
key = paramiko.RSAKey(data=decodebytes(keydata))
client.get_host_keys().add('example.com', 'ssh-rsa', key)
要了解如何获取指纹以在代码中使用,请参阅我的回复:Verify host key with pysftp。
如果您只知道指纹,请参阅:Python - pysftp / paramiko - Verify host key using its fingerprint
或者使用client.load_system_host_keys()
加载已经缓存的主机密钥(例如通过命令行ssh
)。
或者您至少可以缓存第一次尝试时的主机密钥,以确保它在将来不会更改。
为此在connect
之前使用SSHClient.load_host_keys
。它使 Paramiko 自动将新的主机密钥添加到文件中(与 AutoAddPolicy
结合使用时)。
【讨论】:
这应该更高!特别是第一次尝试缓存主机密钥的最后一点:调用client.load_host_keys(os.path.expanduser('~/.ssh/known_hosts'))
和client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
,然后将connect
调用到服务器以保存密钥。随后的连接可以使用client.load_system_host_keys()
加载主机密钥。【参考方案4】:
我遇到了这个问题,想在这里发布一个解决方法。问题确实是 ssh 服务器发送 ecdsa 密钥,paramiko 不支持(尚)。在我的 debian Wheezy 系统上,我通过在 /etc/ssh/sshd_config 中注释掉一行来禁用 ecdsa:
#HostKey /etc/ssh/ssh_host_ecdsa_key
重新启动 sshd,它又恢复使用 RSA。我的 known_hosts 文件中有一些 ecdsa 密钥,所以我只是将其删除以重置,然后手动登录以重新创建密钥。从那里开始,通过 RSA 主机密钥检查,paramiko 按预期完美运行。
【讨论】:
【参考方案5】:我遇到了这个错误:我可以从 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
【讨论】:
我知道这是一个旧线程,但添加“set_missing_host_key_policy”解决了我的问题,因为使用“load_system_host_keys”还不够以上是关于帕拉米科“未知服务器”的主要内容,如果未能解决你的问题,请参考以下文章