使用 pysftp 连接到 SFTP 服务器时出现“无法加载主机密钥”警告

新手上路,请多包涵

我写了一个 Python 脚本来使用密钥身份验证连接到 SFTP 服务器。它成功连接到服务器但显示以下警告(见下文)。这是什么意思以及如何删除它。必须对代码进行哪些更改?

我的代码:

 import os
import pysftp
import socket
import paramiko
import time
import os.path
import shutil

IP = "127.0.X.X"
myUsername = "USERNAME"
port = 22

cnopts = pysftp.CnOpts()
cnopts.hostkeys = None

import os
privatekeyfile = os.path.expanduser("C:\\Users\\Rohan\\.ssh\\cool.prv")
mykey = paramiko.RSAKey.from_private_key_file(privatekeyfile)

try:
    with pysftp.Connection(host=IP, username=myUsername,private_key=mykey,cnopts=cnopts) as sftp:
        try:
            r=str(socket.gethostbyaddr(IP))
            print("connection successful with "+r)

        except socket.herror:
            print("Unknown host")
except:
    print("connection failed")

警告:

 UserWarning: Failed to load HostKeys from C:\Users\Rohan\.ssh\known_hosts.  You will need to explicitly load HostKeys (cnopts.hostkeys.load(filename)) or disableHostKey checking (cnopts.hostkeys = None).
  warnings.warn(wmsg, UserWarning)

原文由 udit kanotra 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
2 个回答

我相信这是 pysftp 中的错误。每次使用 cnopts.hostkeys = None 时都会得到这个(尽管警告实际上建议使用它)。

无论如何,你不应该使用 cnopts.hostkeys = None ,这样做会失去安全性。

有关正确的解决方案,请参阅 使用 pysftp 验证主机密钥


根据您对密钥身份验证的引用,我假设您将您的帐户密钥误认为是主机密钥。阅读我关于 SSH 密钥对 的文章以了解其中的区别。

原文由 Martin Prikryl 发布,翻译遵循 CC BY-SA 4.0 许可协议

这是最新的 pysftp 中的一个错误,即使您设置了 CnOpts.hostkeys = None,只是实例化 CnOpts() 的行为使 pysftp 查找 known_hosts 文件,如果找不到则发出警告。所以我只是进入代码并注释掉警告并加入一些通行证。我别无选择,因为警告消息导致下游出现错误。关键是你可以在这里实现你自己的聪明解决方案:

 ##C:\Python38\Lib\site-packages\pysftp__init__.py

class CnOpts(object):   # pylint:disable=r0903
        def __init__(self, knownhosts=None):
            self.log = False
            self.compression = False
            self.ciphers = None
            if knownhosts is None:
                knownhosts = known_hosts()
            self.hostkeys = paramiko.hostkeys.HostKeys()
            try:
                self.hostkeys.load(knownhosts)
            except IOError:
                # can't find known_hosts in the standard place
                # wmsg = "Failed to load HostKeys from %s.  " % knownhosts
                # wmsg += "You will need to explicitly load HostKeys "
                # wmsg += "(cnopts.hostkeys.load(filename)) or disable"
                # wmsg += "HostKey checking (cnopts.hostkeys = None)."
                # warnings.warn(wmsg, UserWarning)
                pass
            else:
                pass
                # if len(self.hostkeys.items()) == 0:
                    # raise HostKeysException('No Host Keys Found')

原文由 grantr 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题