2013-03-22 7 views
13

Sto provando a utilizzare Paramiko per connettersi a un server SSH da Python. Questo è quello che ho provato finora:Paramiko - utilizzando il file di chiave privata crittografato su 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 

Come si può vedere, non funziona perché la mia chiave privata è crittografata. Tuttavia, la password è memorizzata nel mio portachiavi di login di OS X, e quando scrivo ssh host non la chiederà (piuttosto, chiede solo una volta, quindi la ricorda fino al prossimo riavvio). C'è un modo per fare paramiko usare la password/recuperarla dal portachiavi, come fa ssh?

risposta

7

Il RSAKey.from_private_key_file() è ereditato da PKey(); un parametro facoltativo di questo metodo è una password. Per citare:

Se la chiave privata è crittografata e la password non è None, la data password verrà utilizzata per decifrare la chiave (altrimenti PasswordRequiredException è gettato).

Poiché non si passa una password e la chiave è crittografata, questa eccezione verrà sempre generata. C'è solo un modo per aggirare questo problema, in realtà dare al metodo una password. Pertanto, è necessario un modo per estrarre la password dall'OSXKeychain.

Per eseguire questa operazione è possibile utilizzare il modulo multiplo Keyring.

+0

Ho finito con la creazione di una nuova coppia di chiavi che non aveva una password e l'ho usata, ma accettando ciò poiché ciò avrebbe funzionato probabilmente – houbysoft

+0

Questa era la mia soluzione di fronte a questa situazione @houbysoft ... è solo non ha risposto alla domanda :-). – Ben

+0

Quindi, la password viene utilizzata come decifrare la matrice della passphrase? perché l'ho appena provato e non ha funzionato! –

11

il seguente approccio sembra funzionare bene (su OS X, con la solita configurazione di chiavi private cifrate che hanno passphrase memorizzate nel portachiavi, senza alcuna interazione da parte dell'utente):

import paramiko 

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

Sembra che look_for_keys=False è non assolutamente necessario. Tuttavia, se lo si utilizza, si ottengono messaggi di errore molto migliori in caso di errore di autenticazione ("AuthenticationException" anziché "PasswordRequiredException").


Se davvero si desidera utilizzare direttamente le chiavi private, si potrebbe effettuare le seguenti operazioni:

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) 

Tuttavia, in base alla mia test, questo è non necessario. La soluzione di cui sopra che utilizza ssh.connect in modo semplice dovrebbe essere sufficiente.

+2

Ho riscontrato questo errore con il primo approccio: Nessun metodo di autenticazione disponibile –