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

San*_*aus 10 python sftp pysftp

所以我在通过 SFTP 连接到远程服务器时遇到了很多问题。我已经尝试过像下面这样的正常方法。

sftp = pysftp.Connection(host='Host',username='username',password='passwd',private_key=".ppk")
Run Code Online (Sandbox Code Playgroud)

哪个不起作用。我收到以下错误:

SSHException: 找不到主机 ***** 的主机密钥。

然后我尝试了以下方法:

cnopts = pysftp.CnOpts()
cnopts.hostkeys = None
s = pysftp.Connection(host='host', username='user', password='password', cnopts=cnopts)
Run Code Online (Sandbox Code Playgroud)

这也不起作用。我收到以下错误:

BadAuthenticationType: ('Bad authentication type', ['publickey']) (allowed_types=['publickey'])

同样,当我运行以下命令时:

client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect("host",username = "username",password = "password")
ssh_session = client.get_transport().open_session()
Run Code Online (Sandbox Code Playgroud)

我犯了同样的错误:

BadAuthenticationType: ('Bad authentication type', ['publickey']) (allowed_types=['publickey'])

Mar*_*ryl 11

您混淆了用于身份验证的私钥和用于验证服务器身份的主机密钥。两者都需要处理,而您的所有代码尝试只处理其中之一。请参阅关于SSH 密钥对的文章以了解 SSH 中涉及的两种密钥之间的区别。

所以这应该“工作”:

# Accept any host key (still wrong see below)
cnopts = pysftp.CnOpts()
cnopts.hostkeys = None
# And authenticate with a private key
sftp = pysftp.Connection(
  host='Host', username='user', password='passwd', private_key=".ppk", cnopts=cnopts)
Run Code Online (Sandbox Code Playgroud)

但是这段代码实际上会盲目地接受任何主机密钥(cnopts.hostkeys = None),这是一个安全漏洞。有关正确的方法,请参阅使用 pysftp 验证主机密钥