当尝试使用PySTFP从SFTP服务器检索/发送文件(通过专用连接)时,我试图禁用主机密钥检查,但仍收到一条警告,提示PySTFP无法从已知的_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。主机密钥
参数似乎被“忽略”?
警告不能被抑制,如pysftp 0.2.9。
您所能做的就是创建一个至少有一个条目的known_hosts
文件(它不一定是一个正确的条目,只是具有有效语法的任何条目)。如果在CnOpts
构造函数中显式提供其路径,则可以在标准位置或其他任何位置创建文件。
尽管如此,即使您无法从可靠的来源获得密钥(“但主机不发布密钥”),使用您在开发代码时从服务器获得的公钥仍然比根本不验证密钥要好得多。
请参阅我的答案,以使用PYSTFP验证主机密钥。