当尝试使用pysftp(通过专用连接)从SFTP服务器检索文件/向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
参数似乎被“忽略”的任何想法?
答案 0 :(得分:0)
从pysftp 0.2.9开始,该警告无法被抑制。
您所能做的就是创建一个至少包含一个条目的known_hosts
文件(它不一定是正确的条目,只要是具有有效语法的任何条目)。如果您在CnOpts
构造函数中明确提供文件路径,则可以在标准位置或其他任何位置创建文件。
尽管如此,即使您不能从可靠来源获得密钥(“但主机未发布密钥” ),也要使用从服务器获取的公共密钥。开发代码还是比根本不验证密钥要好得多。
请参阅我对Verify host key with pysftp的回答。