Python “帕拉米科”;未知服务器“;
我正在尝试开始使用Paramiko库,但当我尝试连接以下简单程序时,该库立即引发异常:Python “帕拉米科”;未知服务器“;,python,macos,ssh,paramiko,Python,Macos,Ssh,Paramiko,我正在尝试开始使用Paramiko库,但当我尝试连接以下简单程序时,该库立即引发异常: import paramiko ssh = paramiko.SSHClient() ssh.connect('127.0.0.1', username='boatzart', password='mypassword') 我得到的错误是: 回溯(最近一次呼叫最后一次): 文件“test.py”,第6行,在 ssh.connect('127.0.0.1') 文件“build/bdist.macosx-10.
import paramiko
ssh = paramiko.SSHClient()
ssh.connect('127.0.0.1', username='boatzart', password='mypassword')
我得到的错误是:
回溯(最近一次呼叫最后一次):
文件“test.py”,第6行,在
ssh.connect('127.0.0.1')
文件“build/bdist.macosx-10.7-intel/egg/paramiko/client.py”,第316行,在connect中
文件“build/bdist.macosx-10.7-intel/egg/paramiko/client.py”,第85行,缺少主机密钥
paramiko.SSHException:未知服务器127.0.0.1
无论我尝试哪个服务器,都会发生这种情况。引发异常是因为您缺少主机密钥,相当神秘的“未知服务器”是线索-因为引发异常的原因是
缺少主机密钥
请尝试以下方法:
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')
我也遇到过同样的问题,以下是我的解决方案:
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或编写自己的策略类
更多详情请访问。希望这有帮助。我有一个错误:我可以从shell连接,但paramiko说“未知服务器” 在已知的_主机中有两个类似的条目:
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 |…)似乎让帕拉米科感到困惑。我猜这和这张票有关:
我通过添加以下行解决了此问题:
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
但在这种情况下,这将禁用ssh协议的主机检查:Paramiko认为主机密钥未知,但它是已知的。已知密钥将被忽略。我不在乎,因为在我的环境中,中间人攻击不太可能发生
paraiko版本:1.7.7.1-1ubuntu1我遇到了这个问题,想在这里发布一个解决方法。问题确实是ssh服务器发送ecdsa密钥,这在paramiko中还不受支持。在我的debian Wheezy系统上,我通过注释/etc/ssh/sshd_config中的一行禁用了ecdsa: #HostKey/etc/ssh/ssh\u主机\u ecdsa\u密钥
重新启动了sshd,它又回到了使用RSA。我的已知_hosts文件中有一些ecdsa密钥,所以我只是将其删除以重置,然后手动登录以重新创建密钥。从那时起,paramiko就如预期的那样完美地工作了,具有RSA主机密钥检查功能 正确的方法是:
- 在调用
之前,对返回的实例调用,并向其传递受信任密钥connect
要了解如何获取用于代码的指纹,请参阅我的答案:from base64 import decodebytes # ... keydata = b"""AAAAB3NzaC1yc2EAAAADAQAB...""" key = paramiko.RSAKey(data=decodebytes(keydata)) client.get_host_keys().add('example.com', 'ssh-rsa', key)
如果您只知道指纹,请参阅:
- 或者使用加载已缓存的主机密钥(例如,通过命令行
)ssh
- 或者,您至少可以缓存第一次尝试时的主机密钥,以确保它在将来不会更改
在
连接之前使用。它使Paramiko自动将新的主机密钥添加到文件中(与组合时)
设置缺少的主机密钥策略()
,只需使用加载系统主机密钥()
?@nidHi,前提是您通过调用SSHClient.load\u主机密钥
提前告诉它从何处加载密钥。看,这应该更高一点!特别是关于缓存第一次尝试的主机密钥的最后一个注意事项:调用客户端。加载主机密钥(os.path.expanduser('~/.ssh/known\u hosts')
和客户端。设置主机密钥丢失策略(paramiko.AutoAddPolicy())
,然后连接到服务器以保存密钥。随后的连接可以使用客户端加载主机密钥。加载系统\u主机\u密钥()
。