2017-07-18 55 views
1

我正在使用pysftp软件包版本0.2.9运行Python 3。使用python pysftp软件包,得到“SSHException:服务器上的主机密钥错误”错误

我有以下代码在这里。我正在按照线路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 

有谁知道问题是什么吗?

+0

重复:[paramiko SSHException,来自服务器的主机密钥错误](https://stackoverflow.com/q/38362714/7414759) – stovfl

+0

@stovfl我已经查看过此答案。它不适合我的情况我没有主机私钥,我只有他们的公钥才能连接。 –

+1

示例代码不使用_ **主机私钥** _,它是_ **客户机私钥** _。阅读[了解SSH密钥对](https://winscp.net/eng/docs/ssh_keys)以验证您对用于身份验证的密钥对没有疑惑。 – stovfl

回答

1

看起来这是pysftp中的一个已知错误。在接受的答案在这里:

pysftp -- paramiko SSHException, Bad host key from server

有直接使用父库(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_hosts加载所有公钥。如果您有对该文件的写入权限,那可能是您最简单的解决方案。但是,如果你不能,Transport类有一个add_server_key(key)函数,可以添加服务器标识。请参阅文档here

+0

此解决方案对我无效,因为我没有私钥文件。我只有由我尝试连接的主机提供的公钥文件。更新示例 –

+0

不使用私钥。 (该私钥用于对服务器进行身份验证,而不是对服务器本身进行针对MITM攻击的身份验证)的密钥太多。 :) – keredson

+0

我很欣赏这次更新。它对我很好。可以肯定的是,添加密钥的代码仅仅是'key = paramiko.pkey.PKey('path_to_keyfile'); transport.add_server_key(键)'。 –