20

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

ご覧のとおり、秘密鍵が暗号化されているため失敗しています。ただし、パスワードは OS X のログイン キーチェーンに保存されており、入力してssh hostも要求されません (むしろ、一度だけ要求され、次の再起動まで記憶されます)。paramikoパスワードを使用する/キーチェーンから取得する方法はありsshますか?

4

3 に答える 3

14

次のアプローチは問題なく動作するようです (OS X では、パスフレーズがキーチェーンに保存されている暗号化された秘密鍵の通常の設定で、ユーザーの操作は必要ありません)。

import paramiko

ssh = paramiko.SSHClient()
ssh.load_system_host_keys()
ssh.connect(HOST, username=USER, look_for_keys=False)
...
ssh.close()

look_for_keys=False絶対に必要というわけではないようです。ただし、これを使用すると、認証が失敗した場合のエラー メッセージが大幅に改善されます (「PasswordRequiredException」ではなく「AuthenticationException」)。


秘密鍵を直接使用したい場合、次のようにします。

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)

ただし、私のテストに基づくと、これは必要ありません。単純な方法で使用する上記のソリューションでssh.connect十分です。

于 2013-07-18T20:06:20.927 に答える
10

RSAKey.from_private_key_file()から継承されPKey()ます。このメソッドのオプション パラメータはパスワードです。引用するには:

秘密鍵が暗号化されていて、パスワードが None でない場合、指定されたパスワードが鍵の復号化に使用されます (それ以外の場合は PasswordRequiredException がスローされます)。

パスワードを渡さず、キーが暗号化されているため、この例外は常にスローされます。この問題を回避する唯一の方法は、メソッドに実際にパスワードを与えることです。したがって、OSXKeychain からパスワードを取得する方法が必要です。

これを行うには、クロスプラットフォームKeyringモジュールを使用できます。

于 2013-03-24T10:10:48.037 に答える