2013-03-22 28 views
13

我試圖使用Paramiko從Python連接到SSH服務器。這是我到目前爲止的嘗試:Paramiko - 在OS X上使用加密的私鑰文件

>>> 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那樣?

回答

7

RSAKey.from_private_key_file()繼承自PKey();此方法的可選參數是密碼。引述:

如果私有密鑰加密和密碼不是無,給定的 密碼將被用於解密密鑰(否則 PasswordRequiredException的異常)。

由於您未傳遞密碼且密鑰已加密,因此此異常將始終引發。圍繞這個問題只有一個辦法,實際上給這個方法一個密碼。因此,您需要從OSXKeychain中獲取密碼。

您可以使用跨平臺Keyring模塊來執行此操作。

+0

我剛剛創建了一個沒有密碼並使用它的新密鑰對,但接受了這個,因爲這可能會起作用 – houbysoft 2013-04-24 22:34:59

+0

這是我自己的解決方案,當遇到這種情況@houbysoft ...它只是沒有回答這個問題:-)。 – Ben 2013-04-26 17:04:44

+0

那麼,密碼正在用作密碼解密?因爲我剛剛嘗試過,它不起作用! – 2016-04-07 23:19:58

11

下面的辦法似乎很好地工作(在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是不是絕對必要的。但是,如果您使用它,在認證失敗的情況下(「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) 

但是,根據我的測試,這是需要。以直接方式使用ssh.connect的上述解決方案應該足夠。

+2

我的第一種方法出現此錯誤: 沒有可用的身份驗證方法 – 2015-12-16 17:52:03

相關問題