如何通过使用 ppk 公钥的 Python Paramiko 连接 ssh

我使用 帕拉米科通过 SSH 连接到服务器。

基本的身份验证工作得很好,但是我不明白如何连接公钥。

当我连接 PuTTY 时,服务器告诉我:

Using username "root".
Authenticating with public key "rsa-key@ddddd.com"
Passphrase for key "rsa-key@ddddd.com": [i've inserted the passphrase here]
Last login: Mon Dec  5 09:25:18 2011 from ...

我通过这个 ppk 文件连接到它:

PuTTY-User-Key-File-2: ssh-rsa
Encryption: aes256-cbc
Comment: rsa-key@dddd.com
Public-Lines: 4
[4 lines key]
Private-Lines: 8
[8 lines key]
Private-MAC: [hash]

对于基本认证,我(从日志中)得到的错误是:

DEB [20111205-09:48:44.328] thr=1   paramiko.transport: userauth is OK
DEB [20111205-09:48:44.927] thr=1   paramiko.transport: Authentication type (password) not permitted.
DEB [20111205-09:48:44.927] thr=1   paramiko.transport: Allowed methods: ['publickey', 'gssapi-with-mic']

我试图包含这个 ppk 文件并将其设置为 auth_public_key,但是没有成功。

你能帮我吗?

161472 次浏览

OK@Adam 和@Kimvais 是对的,Paramiko 无法解析.ppk 文件。

因此(也多亏了@JimB) ,我们要做的就是改变信仰。Ppk 文件转换为 OpenSSH 私钥格式; 这可以使用 PuTTYgen实现,如所述 给你

然后就很简单了:

import paramiko
ssh = paramiko.SSHClient()


ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())


ssh.connect('<hostname>', username='<username>', password='<password>', key_filename='<path/to/openssh-private-key-file>')


stdin, stdout, stderr = ssh.exec_command('ls')
print stdout.readlines()
ssh.close()

创建一个由 Puttygen 的 Paramiko 支持的有效的 DSA 格式私钥。

点击转换然后导出 OpenSSH 密钥

enter image description here

对我来说,我这样做:

import paramiko
hostname = 'my hostname or IP'
myuser   = 'the user to ssh connect'
mySSHK   = '/path/to/sshkey.pub'
sshcon   = paramiko.SSHClient()  # will create the object
sshcon.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # no known_hosts error
sshcon.connect(hostname, username=myuser, key_filename=mySSHK) # no passwd needed

我觉得挺好的

@ VonC 回答(删除)重复问题:

如果如上所述,Paraminko 不支持 PPK 键,那么正式的解决方案(如此处所示)将使用 PuTTYgen

但是您也可以使用 Python 库 CkSshKey在程序中直接进行相同的转换。

看“ 将 PuTTY 私钥(ppk)转换为 OpenSSH (pem)

import sys
import chilkat


key = chilkat.CkSshKey()


#  Load an unencrypted or encrypted PuTTY private key.


#  If  your PuTTY private key is encrypted, set the Password
#  property before calling FromPuttyPrivateKey.
#  If your PuTTY private key is not encrypted, it makes no diffference
#  if Password is set or not set.
key.put_Password("secret")


#  First load the .ppk file into a string:


keyStr = key.loadText("putty_private_key.ppk")


#  Import into the SSH key object:
success = key.FromPuttyPrivateKey(keyStr)
if (success != True):
print(key.lastErrorText())
sys.exit()


#  Convert to an encrypted or unencrypted OpenSSH key.


#  First demonstrate converting to an unencrypted OpenSSH key


bEncrypt = False
unencryptedKeyStr = key.toOpenSshPrivateKey(bEncrypt)
success = key.SaveText(unencryptedKeyStr,"unencrypted_openssh.pem")
if (success != True):
print(key.lastErrorText())
sys.exit()