pysftp 忽略禁用的主机密钥检查

Posted

技术标签:

【中文标题】pysftp 忽略禁用的主机密钥检查【英文标题】:pysftp ignoring disabled hostkey checking 【发布时间】:2019-09-22 08:49:00 【问题描述】:

当尝试使用 pysftp 从/向 SFTP 服务器检索/发送文件(通过专用连接)时,我正在尝试禁用主机密钥检查,但我仍然收到 pysftp 无法加载known_hosts 文件中的主机密钥。尽管出现警告,文件传输过程仍按预期完成。

我知道跳过密钥检查不是最佳做法,但主机不会发布密钥,并且它的通信发生在传输预加密文件的专用网络上,因此在这种特殊情况下风险相对较低。

也就是说,我试图将一个空的 known_hosts 文件放在正确的目录中,结果却出现了更严重的错误。

以下示例代码对我来说很好用...除了下面的警告。

import sys
import pysftp

hostname = "123.123.123.123"
username = "abc"       
password = "xyz"  

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

with pysftp.Connection(hostname, username=username, password=password, cnopts=cnopts) as sftp:
    sftp.get('/test.get', preserve_mtime=True)
    sftp.put('test.put', preserve_mtime=True)

执行该脚本时会生成以下警告:

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

我可以忍受正在生成的警告消息,但我肯定更喜欢在代码执行时有一个干净的终端输出。关于为什么 cnopts.hostkeys 参数似乎被“忽略”的任何想法?

【问题讨论】:

【参考方案1】:

无法抑制警告,从 pysftp 0.2.9 开始。

您所能做的就是创建一个至少包含一个条目的known_hosts 文件(它不必是正确的条目,只要是具有有效语法的任何条目即可)。如果您在 CnOpts 构造函数中明确提供文件路径,则可以在标准位置或其他任何位置创建文件。


不过,即使您无法从可靠来源获取密钥(“但主机不发布密钥”),使用您在开发代码仍然比根本不验证密钥要好。

查看我对Verify host key with pysftp的回复。

【讨论】:

以上是关于pysftp 忽略禁用的主机密钥检查的主要内容,如果未能解决你的问题,请参考以下文章

使用 pysftp 验证主机密钥

使用 pysftp 验证主机密钥

使用私钥通过 pysftp 连接到 SFTP 服务器时“找不到主机 ***** 的主机密钥”

错误:pysftp 中的“无法加载主机密钥”[重复]

如何使用 ssh-ed25519 作为 pysftp 的密钥来设置主机密钥文件

使用 pysftp 执行 sftp 但出现主机密钥错误