提问者:小点点

使用python PySFP包,获取“SSHException:来自服务器的错误主机密钥”错误[duplicate]


我正在运行pysftp包版本为0.2的Python 3。9

下面是我的代码。我正在正确加载主机密钥,如第cnopts行所示。主机钥匙。键()

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,来自服务器的主机密钥错误

有一个直接使用父库(paramiko)的示例代码,pysftp包装:

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_主机。如果您有该文件的写权限,那么这可能是最简单的解决方案。但是如果您不能,则传输类具有一个添加服务器密钥(key)函数,该函数将添加服务器标识。见这里的医生。