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

时间:2018-12-20 07:36:21

标签: python sftp pysftp

所以我在通过SFTP连接到远程服务器时遇到很多问题。我已经尝试过以下常规方式。

sftp = pysftp.Connection(host='Host',username='username',password='passwd',private_key=".ppk")

哪个没有用。我收到以下错误:

  

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

然后我尝试了以下操作:

cnopts = pysftp.CnOpts()
cnopts.hostkeys = None
s = pysftp.Connection(host='host', username='user', password='password', cnopts=cnopts)

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

  

BadAuthenticationType :(“错误身份验证类型”,['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()

我遇到相同的错误:

  

BadAuthenticationType :(“错误身份验证类型”,['publickey'])(allowed_types = ['publickey'])

2 个答案:

答案 0 :(得分:0)

您正在混淆用于身份验证的私钥和用于验证服务器标识的主机密钥。两者都需要照顾,而您的所有代码尝试仅照顾其中之一。请参阅SSH key pairs上的 my 文章以了解区别。

所以这应该“起作用”:

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

但是此代码实际上将盲目接受任何主机密钥,这是一个安全漏洞。
有关正确的方法,请参见Verify host key with pysftp

答案 1 :(得分:-1)

您正在连接的host似乎不可用。当由于防火墙规则(或主机上的错字)而无法访问主机名时,通常会发生这种情况。 我建议先检查一下是否可以从(unix)终端进行sftp

> sftp username@host

如果系统提示您输入密码或登录,则可以从该计算机连接到该主机

如果不尝试使用端口22上的netcat检查该主机是否可用,则在主机不可用时会超时或管道中断

>nc -v host 22

我建议仅在此之后调试pysftpparamiko软件包。

此外,如果您正在使用私钥进行身份验证,则无需使用密码。