使用私钥连接到服务器时pysftp AuthenticationException

时间:2015-12-04 20:42:47

标签: pysftp

我正在尝试连接到sftp服务器。我有一个私钥和一个密码。 我试图在SO上阅读相关问题,但无法成功连接。

这就是我的尝试:

 pysftp.Connection(host=<hostname>, username=<username>,
                   password=<password>, private_key=<path to .ppk file>)

AuthenticationException:身份验证失败

  pysftp.Connection(host=<hostname>, username=<username>,
                   private_key_pass=<password>, private_key=<path to .ppk file>) 

SSHException:不是有效的DSA私钥文件

但是,我可以使用相同的凭据并与Filezilla连接。 Filezilla要求输入密码并将.ppk文件转换为不受保护的文件。

我尝试使用与filezilla中使用的相同的url,用户名和密钥文件,但我继续收到错误。 还尝试使用paramiko连接。

现在已经尝试使用python建立连接几个小时了。 任何帮助将不胜感激。

感谢。

5 个答案:

答案 0 :(得分:4)

我终于可以连接了。

使用putty将文件转换为.pem文件。传递此.pem文件并保持其余参数与以前相同。

pysftp.Connection(host ='hostname',username ='username',                    password ='password',private_key ='.pem文件的路径')

希望这可以帮助有类似问题的人。

答案 1 :(得分:0)

我通过从pysftp0.2.9降级到pysftp 0.2.8解决了这个问题

pip install pysftp==0.2.8

我在连接字符串中使用私钥和私钥密码,如下所示:

import pysftp as sftp
import sys
srver = sftp.Connection(host='xx.xxx.xx.xx',username='xxxxx',password='xxx',port=9999,private_key='C:\\Users\xxxx\xxx\id_rsa.ppk',private_key_pass='xxxxxx')

请记住,端口实际上是一个不是字符串的数字。此解决方案适用于所有希望使用私钥和私钥密码与主机名,用户名和用户密码进行连接的人。

答案 2 :(得分:0)

我在 Linux 环境中遇到了同样的问题,我试图按照已接受的答案中的解决方案进行操作。我遇到的第一个问题是将 .ppk 文件转换为 .pem 文件。我发现在 Debian 环境中,我们可以使用 PuTTY 工具将 .ppk 文件转换为 .pem 文件

$ sudo apt-get install putty-tools
$ puttygen abc.ppk -O private-openssh -o abc.pem

我在尝试接受的答案时遇到的第二个问题是身份验证错误,我使用 private_key_pass 而不是 password 并且我能够建立连接。

cnopts = pysftp.CnOpts()

cnopts = modify_cnopts_as_you_wish(cnopts)

srv = pysftp.Connection(host="hostname", username="user",
                        private_key='path_to_abc.pem',
                        private_key_pass="password", 
                        cnopts=cnopts)

答案 3 :(得分:-2)

当您从Linux控制台使用ssh-keygen添加密钥时,可以直接使用-m PEM选项,而不是使用Putty。

ssh-keygen -t rsa -m PEM

答案 4 :(得分:-2)

我能够通过以下方式解决同样的问题

ssh-keygen -t rsa -m PEM" command and 
pysftp.Connection(host='hostname', username='username',
                   private_key_pass='password', private_key='path to .pem file')