[英]Host key not found error with pysftp connection
我正在嘗試使用 Python 3 課程中的以下代碼將文件推送到 FTP 服務器。 我知道以前有人問過這個問題,但其他問題似乎沒有我嘗試過那么多嘗試。
import pysftp as sftp
import paramiko
from base64 import decodebytes
def get_cnoopts():
#keydata = b"""2048 SHA256:XpP32aA8DFDaJ46A3V7GEXk+wJldB3K7HHAFlD4pvQ4 root@DevTuts (RSA)"""
keydata = b"""2048 SHA256:XpP32aA8DFDaJ46A3V7GEXk+wJldB3K7HHAFlD4pvQ4"""
key = paramiko.RSAKey(data=decodebytes(keydata))
cnoopts = sftp.CnOpts()
cnoopts.hostkeys.add("178.62.45.50", "ssh-rsa", key)
def push_file():
s = sftp.Connection("198.63.45.20", username="root", password="sfewewetw", cnopts=get_cnoopts())
local_path = "testme.txt"
remote_path = "/home/testme.txt"
s.put(local_path, remote_path)
s.close()
push_file()
我已經更改了上面的敏感數據以保護無辜者,所以這段代碼永遠不會為你工作。
我首先嘗試不使用cnopts=get_cnoopts()
參數,然后我得到了非常解釋性的錯誤:
SSHException: No hostkey for host 178.62.45.50 found.
然后我在這個SO 答案的答案中找到了get_cnoopts
的代碼,但現在我必須找到一個不會在decodebytes
上引發錯誤的密鑰。
使用ssh-keyscan
查找主機密鑰會產生:
# 178.62.45.50:22 SSH-2.0-OpenSSH_7.6p1 Ubuntu-4ubuntu0.3
178.62.45.50 ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIHTaCuJ+5dzrHyHWr7GwD/c2x7cwL2IaEiXpI+ygd4Ma
# 178.62.45.50:22 SSH-2.0-OpenSSH_7.6p1 Ubuntu-4ubuntu0.3
178.62.45.50 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDGeglgB51BVCuh6wVZFrp2iyBEOFpaLDiSobQT+41Nn39kSGEJXBUPJ+aJfLRZ2e4Eu2o+3DV4gKsG4IEnV10WpBQxAmuq4EQesO/wTQdfgregarteartyertyer5sJwKkyTvLxBLX3AplbS1zBrSTvMWnqqvNV8IaqcR43JOkdt8frtm6dELalNpdTN4Vm/+VdRiFpzUIUj4lyVcnlttXXreE7p8qciRRfCFYA5OhsAvsSDxccv99dvHDYsrdomHZRbpYzel2QNSWLylEsnbRLDABY13n4xtELXC0Us8QyMjhF2x5l7fkm4RYjQmheNdkoN1Ot
# 178.62.45.50:22 SSH-2.0-OpenSSH_7.6p1 Ubuntu-4ubuntu0.3
178.62.45.50 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNretryreyrtZE8I2opSVi7R+2nlGMOs05s8j1NZfH3vIB7mL1ehfPbgp8Sjg8daQxQkm0U+NqWjCRE=
我嘗試了所有關鍵行,第一行給了我:
SSHException: No hostkey for host 178.62.45.50 found.
當我說我嘗試了所有關鍵行時,對於ssh-keyscan
給出的每個潛在密鑰,我已將 output 中的每一行替換為我的 Python 腳本中的keydata
變量值。
現在我嘗試將整個字符串用於keydata
,並從鍵字符串的開頭跳過單詞,兩者都給了我同樣的錯誤。 使用第二個和第三個鍵字符串我得到了同樣的錯誤。 我檢查的答案還建議使用pysftp.CnOpts(knownhosts='known_hosts')
其中 'known_hosts' 包含服務器公鑰。
然后我嘗試了相同答案中建議的另一種方法,作為get_cnoopts
的替代方法:
def get_cnoopts():
cnoopts = sftp.CnOpts(knownhosts="""178.62.45.50 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDGeglgB51BVCuh6wVZFrp2iyBEOFpaLDiSobQT+41Nn39kSGEJXBUPJ+aJfLRZ2e4Eu2o+3DV4gKsG4IEnV10WpBQxAmuq4EQesO/wTQCXuUPw7LknIbIA3pFvJUxOa1K3xRm2TZgs9esJwKkyTvLxBLX3AplbS1zBrSTvMWnqqvNV8IaqcR43JOkdt8frtm6dELalNpdTN4Vm/+VdRiFpzUIUj4lyVcnlttXXreE7p8qciRRfCFYA5OhsAvsSDxccv99dvHDYsrdomHZRbpYzel2QNSWLylEsnbRLDABY13n4xtELXC0Us8QyMjhF2x5l7fkm4RYjQmheNdkoN1Ot""")
return cnoopts
我得到了同樣的錯誤。 然后我嘗試了另一個建議,使用winSCP->Server and protocol information dialogue, which lists MD5 and SHA-256 keys nice and explicitly. I have tried both key strings, with and without prefixes like
winSCP->Server and protocol information dialogue, which lists MD5 and SHA-256 keys nice and explicitly. I have tried both key strings, with and without prefixes like
,但同樣的錯誤。
我懷疑課程的代碼已經過時,或者我在源代碼和我的 Python 代碼之間復制和粘貼時引入了某種編碼問題。 這里有什么問題?
您的get_cnoopts()
不return
任何內容,因此cnoopts=get_cnoopts()
將與cnoopts=
相同。 嘗試將return cnoopts
添加到get_cnoopts()
function 的末尾:
def get_cnoopts():
keydata = b"""AAAA..."""
key = paramiko.RSAKey(data=decodebytes(keydata))
cnoopts = sftp.CnOpts()
cnoopts.hostkeys.add("178.62.45.50", "ssh-rsa", key)
return cnoopts
我自己對 pysftp 的密鑰處理感到沮喪 - 在從ssh-keyscan
的 output 復制/粘貼之后,我只能通過手動加載(像你一樣)主機的 RSA 密鑰來讓它工作。 但是您在代碼中顯示的密鑰片段看起來不正確:ssh RSA 密鑰應始終以“AAAA”開頭,后跟連續的 stream 的 base64 編碼文本(因此沒有空格或連字符)。 嘗試進行這兩項更改並報告。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.