簡體   English   中英

pysftp 連接未找到主機密鑰錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM