"Failed to load HostKeys" 使用 pysftp 连接到 SFTP 服务器时出现警告
"Failed to load HostKeys" warning while connecting to SFTP server with pysftp
我写了一个 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)
我认为这是 pysftp 中的错误。每次使用 cnopts.hostkeys = None
时都会得到这个(尽管警告实际上建议使用它)。
无论如何,你不应该使用 cnopts.hostkeys = None
,这样做会失去安全性。
有关正确的解决方案,请参阅 Verify host key with pysftp。
根据您提到的密钥验证,我假设您将帐户密钥误认为是主机密钥。
阅读我关于 SSH key pairs 的文章以了解差异。
这是最新的 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')
我用的是0.2.9版本也有同样的问题。
如果您唯一关心的是警告消息(在我的例子中一直显示也明确设置 hostkeys = none
)并且您只想摆脱它而不弄乱模块的代码,您可以使用适当的方法 filterwarnings 用于打印消息的模块 warnings。
这将抑制 所有 警告
import warnings
warnings.filterwarnings('ignore')
相反,这将抑制所有以“无法加载主机密钥”开头的警告消息,我相信这只是在这种情况下发生的那个:
import warnings
warnings.filterwarnings('ignore','.*Failed to load HostKeys.*')
我写了一个 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)
我认为这是 pysftp 中的错误。每次使用 cnopts.hostkeys = None
时都会得到这个(尽管警告实际上建议使用它)。
无论如何,你不应该使用 cnopts.hostkeys = None
,这样做会失去安全性。
有关正确的解决方案,请参阅 Verify host key with pysftp。
根据您提到的密钥验证,我假设您将帐户密钥误认为是主机密钥。 阅读我关于 SSH key pairs 的文章以了解差异。
这是最新的 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')
我用的是0.2.9版本也有同样的问题。
如果您唯一关心的是警告消息(在我的例子中一直显示也明确设置 hostkeys = none
)并且您只想摆脱它而不弄乱模块的代码,您可以使用适当的方法 filterwarnings 用于打印消息的模块 warnings。
这将抑制 所有 警告
import warnings
warnings.filterwarnings('ignore')
相反,这将抑制所有以“无法加载主机密钥”开头的警告消息,我相信这只是在这种情况下发生的那个:
import warnings
warnings.filterwarnings('ignore','.*Failed to load HostKeys.*')