【问题标题】:"Failed to load HostKeys" warning while connecting to SFTP server with pysftp使用 pysftp 连接到 SFTP 服务器时出现“加载主机密钥失败”警告
【发布时间】:2019-10-24 13:38:28
【问题描述】:

我编写了一个 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)

【问题讨论】:

    标签: python python-3.x ssh paramiko pysftp


    【解决方案1】:

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

    无论如何,您不应该使用cnopts.hostkeys = None,这样做会失去安全性。
    正确解决方法见Verify host key with pysftp


    通过您对密钥身份验证的引用,我假设您将帐户密钥与主机密钥混淆了。 阅读我关于 SSH key pairs 的文章以了解其中的区别。

    【讨论】:

      【解决方案2】:

      这是最新的 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')
      

      【讨论】:

      • 嘿,这是 pysftp 0.2.9 版的吗?
      • @flyingfishcattle - 是的,这就是我正在使用的版本。同样,这是一个 hack,但我不得不删除该警告,因为它会导致问题。
      • 但请确保您了解不应使用它来允许您设置CnOpts.hostkeys = None 而不会收到警告。你不应该设置hostkeys = None。这是一个安全漏洞。
      【解决方案3】:

      另外我使用的是 0.2.9 版本并且有同样的问题。 如果您唯一关心的是警告消息(在我的情况下,它一直显示还显式设置hostkeys = none)并且您只想摆脱它而不弄乱模块的代码,您可以使用适当的方法 用于打印消息的模块warnings 的过滤警告
      这将抑制所有警告

      import warnings
      warnings.filterwarnings('ignore')
      

      这将抑制所有以“加载主机密钥失败”开头的警告消息,我相信这只是在这种情况下发生的警告消息:

      import warnings
      warnings.filterwarnings('ignore','.*Failed to load HostKeys.*')
      

      【讨论】:

        猜你喜欢
        • 2019-05-20
        • 2021-11-27
        • 2020-02-25
        • 2016-03-09
        • 2022-12-14
        • 1970-01-01
        • 1970-01-01
        • 2017-12-29
        • 2020-12-25
        相关资源
        最近更新 更多