使用 python pysftp 包,得到“SSHException:来自服务器的错误主机密钥”错误 [重复]
Posted
技术标签:
【中文标题】使用 python pysftp 包,得到“SSHException:来自服务器的错误主机密钥”错误 [重复]【英文标题】:Using python pysftp package, getting a "SSHException: Bad host key from server" error [duplicate] 【发布时间】:2017-12-23 16:14:07 【问题描述】:我正在运行 Python 3 和 pysftp 包,版本 0.2.9。
我的以下代码在这里。我正在正确加载主机密钥,如cnopts.hostkeys.keys()
行所示。
import pysftp
key_file_test = './path_to_key_file/key_file.pub'
DOWNLOAD_UAT =
"USERNAME": "xxxxxxxx",
"PASSWORD": "xxxxxxxx"
UAT_FTP_SITE = 'sftp-test.site.com'
cnopts = pysftp.CnOpts()
cnopts.hostkeys.load(key_file_test)
cnopts.hostkeys.keys()
'''['github.com', 'XXX.XX.XXX.XXX', 'sftp-test.site.com']'''
srv = pysftp.Connection(host=UAT_SFTP_SITE, username=DOWNLOAD_UAT['USERNAME'],
password=DOWNLOAD_UAT['PASSWORD'], cnopts=cnopts, port=22)
然后我运行最后一行时的错误是
---------------------------------------------------------------------------
SSHException Traceback (most recent call last)
<ipython-input-82-308ec955a92e> in <module>()
8
9 srv = pysftp.Connection(host=UAT_SFTP_SITE, username=DOWNLOAD_UAT['USERNAME'],
---> 10 password=DOWNLOAD_UAT['PASSWORD'], cnopts=cnopts, port=22)
11 data = srv.listdir()
C:\ProgramData\Anaconda3\lib\site-packages\pysftp\__init__.py in __init__(self, host, username, private_key, password, port, private_key_pass, ciphers, log, cnopts, default_path)
141 self._transport.use_compression(self._cnopts.compression)
142 self._set_authentication(password, private_key, private_key_pass)
--> 143 self._transport.connect(**self._tconnect)
144
145 def _set_authentication(self, password, private_key, private_key_pass):
C:\ProgramData\Anaconda3\lib\site-packages\paramiko\transport.py in connect(self, hostkey, username, password, pkey, gss_host, gss_auth, gss_kex, gss_deleg_creds)
1139 key.get_name(), repr(key.asbytes()))
1140 )
-> 1141 raise SSHException('Bad host key from server')
1142 self._log(DEBUG, 'Host key verified (%s)' % hostkey.get_name())
1143
SSHException: Bad host key from server
有谁知道这里的问题是什么?
【问题讨论】:
【参考方案1】:看起来这是pysftp
中的一个已知错误。在此处接受的答案中:
pysftp -- paramiko SSHException, Bad host key from server
有直接使用pysftp
包装的父库(paramiko
)的示例代码:
import paramiko
transport = paramiko.Transport(('server.com',22))
transport.connect(username='XXXXX', password='XXXXX')
sftp = paramiko.SFTPClient.from_transport(transport)
print(sftp.listdir())
编辑:
我将上面的示例更新为不使用私钥进行连接,而是使用用户名/密码。
我发布的原始代码(请参阅编辑历史记录)将默认加载来自~/.ssh/known_hosts
的所有公钥。如果您对该文件具有写入权限,那么这可能是您最简单的解决方案。但是如果你不能,Transport
类有一个add_server_key(key)
函数可以添加服务器标识。请参阅文档here。
【讨论】:
您的代码从known_hosts
加载公钥是不正确的。它实际上不加载任何主机密钥。这就是它“有效”的原因。您的 known_hosts
可能包含错误的主机密钥。通过以您的方式使用Transport
,您可以通过完全避免主机密钥验证来绕过问题。您的代码容易受到MITM attacks 的影响。有关正确的解决方案,请参阅Verify host key with pysftp以上是关于使用 python pysftp 包,得到“SSHException:来自服务器的错误主机密钥”错误 [重复]的主要内容,如果未能解决你的问题,请参考以下文章