2017-07-18 49 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(鍵)'。 –