Paramiko - 在OS X上使用加密的私钥文件

hou*_*oft 18 ssh paramiko osx-mountain-lion private-key

我正在尝试使用Paramiko从Python连接到SSH服务器.这是我到目前为止所尝试的:

>>> import paramiko
>>> import os
>>> privatekeyfile = os.path.expanduser('~/.ssh/id_rsa')
>>> mykey = paramiko.RSAKey.from_private_key_file(privatekeyfile)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/paramiko/pkey.py", line 198, in from_private_key_file
    key = cls(filename=filename, password=password)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/paramiko/rsakey.py", line 51, in __init__
    self._from_private_key_file(filename, password)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/paramiko/rsakey.py", line 163, in _from_private_key_file
    data = self._read_private_key_file('RSA', filename, password)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/paramiko/pkey.py", line 280, in _read_private_key_file
    data = self._read_private_key(tag, f, password)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/paramiko/pkey.py", line 323, in _read_private_key
    raise PasswordRequiredException('Private key file is encrypted')
paramiko.PasswordRequiredException: Private key file is encrypted
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,它失败了,因为我的私钥是加密的.但是,密码存储在我的OS X登录密钥链中,当我输入时ssh host它不会要求它(相反,它只询问一次,然后记住它直到下次重启).有没有办法paramiko使用密码/从钥匙串中取出它,就像ssh这样?

Juk*_*ela 13

以下方法似乎工作正常(在OS X上,通常设置加密私钥,密钥链中存储密码,无需任何用户交互):

import paramiko

ssh = paramiko.SSHClient()
ssh.load_system_host_keys()
ssh.connect(HOST, username=USER, look_for_keys=False)
...
ssh.close()
Run Code Online (Sandbox Code Playgroud)

这似乎look_for_keys=False并非绝对必要.但是,如果您使用它,在身份验证失败的情况下("AuthenticationException"而不是"PasswordRequiredException"),您将获得更好的错误消息.


如果您确实想直接使用私钥,可以执行以下操作:

import os
import paramiko
import keyring

keyfile = os.path.expanduser('~/.ssh/id_rsa')
password = keyring.get_password('SSH', keyfile)
key = paramiko.RSAKey.from_private_key_file(keyfile, password=password)
Run Code Online (Sandbox Code Playgroud)

但是,根据我的测试,这不是必需的.ssh.connect以直接方式使用的上述解决方案应该是足够的.

  • 我的第一种方法是出现此错误:没有可用的身份验证方法 (3认同)

Ben*_*Ben 8

RSAKey.from_private_key_file()是从继承PKey(); 此方法的可选参数是密码.报价:

如果私钥被加密且密码不是None,则使用给定的密码来解密密钥(否则抛出PasswordRequiredException).

由于您没有传递密码并且您的密钥已加密,因此将始终抛出此异常.这个问题只有一种方法,实际上给方法一个密码.因此,您需要一种从OSXKeychain中获取密码的方法.

您可以使用跨平台Keyring模块执行此操作.