udi*_*tra 6 python ssh paramiko python-3.x 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")
Run Code Online (Sandbox Code Playgroud)
警告:
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")
Run Code Online (Sandbox Code Playgroud)
我也使用0.2.9版本并且有同样的问题。如果您唯一关心的是警告消息(在我的情况下也一直显示为显式设置hostkeys = none)并且您只想摆脱它而不弄乱模块的代码,则可以使用模块警告的适当方法filterwarnings用于打印消息。
这将抑制所有警告
import warnings
warnings.filterwarnings('ignore')
Run Code Online (Sandbox Code Playgroud)
相反,这将抑制所有以“无法加载主机密钥”开头的警告消息,我相信这只是在这种情况下发生的消息:
import warnings
warnings.filterwarnings('ignore','.*Failed to load HostKeys.*')
Run Code Online (Sandbox Code Playgroud)
我相信这是 pysftp 中的一个错误。每次使用时都会得到这个cnopts.hostkeys = None(尽管警告实际上建议使用它)。
无论如何,您不应该使用cnopts.hostkeys = None,这样做会失去安全性。
有关正确的解决方案,请参阅使用 pysftp 验证主机密钥。
根据您对密钥身份验证的参考,我假设您将帐户密钥与主机密钥搞错了。请阅读我有关SSH 密钥对的文章以了解其中的区别。