2013-03-22 5 views
13

पर एन्क्रिप्टेड निजी कुंजी फ़ाइल का उपयोग करके मैं पाइथन से एसएसएच सर्वर से कनेक्ट करने के लिए पैरामीको का उपयोग करने की कोशिश कर रहा हूं। मैंने अभी तक यह कोशिश की है:पैरामीको - ओएस एक्स

>>> 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 

जैसा कि आप देख सकते हैं, यह विफल हो रहा है क्योंकि मेरी निजी कुंजी एन्क्रिप्ट की गई है। हालांकि, पासवर्ड मेरे ओएस एक्स लॉगिन कीचेन में संग्रहीत है, और जब मैं ssh host टाइप करता हूं तो यह इसके लिए नहीं पूछेगा (बल्कि, यह केवल एक बार पूछता है, फिर इसे अगले रीबूट तक याद करता है)। क्या paramiko पासवर्ड का उपयोग करने के लिए कोई तरीका है/इसे कीचेन से लाएं, जैसे ssh करता है?

उत्तर

7

RSAKey.from_private_key_file()PKey() से विरासत में मिला है; इस विधि का एक वैकल्पिक पैरामीटर एक पासवर्ड है। के शब्दों में:

निजी कुंजी एन्क्रिप्टेड है और पासवर्ड नहीं कोई नहीं है, यह देखते हुए पासवर्ड कुंजी डिक्रिप्ट करने के लिए उपयोग किया जाएगा (अन्यथा PasswordRequiredException फेंक दिया जाता है)।

चूंकि आप कोई पासवर्ड नहीं पारित कर रहे हैं और आपकी कुंजी एन्क्रिप्ट की गई है तो यह अपवाद हमेशा फेंक दिया जाएगा। वास्तव में विधि को पासवर्ड देने के लिए, इस समस्या के चारों ओर केवल एक ही रास्ता है। इसलिए, आपको OSXKeychain से पासवर्ड प्राप्त करने का एक तरीका चाहिए।

आप ऐसा करने के लिए क्रॉस-प्लेटफ़ॉर्म Keyring मॉड्यूल का उपयोग कर सकते हैं।

+0

मैंने केवल एक नई कुंजी जोड़ी बनाई, जिसमें पासवर्ड नहीं था और इसका उपयोग कर रहा था, लेकिन यह स्वीकार कर रहा था क्योंकि इससे शायद – houbysoft

+0

काम किया होगा, यह स्थिति मेरा समाधान था जब इस स्थिति का सामना करना पड़ा @ houbysoft ... यह सिर्फ सवाल का जवाब नहीं दिया :-)। – Ben

+0

तो, पासवर्ड का उपयोग पासफ्रेज मरने के रूप में किया जा रहा है? क्योंकि मैंने अभी कोशिश की और यह काम नहीं किया! –

11

निम्नलिखित दृष्टिकोण (, ओएस एक्स पर, एन्क्रिप्टेड निजी कुंजी है-चेन में संग्रहीत पासफ्रेज के सामान्य सेटअप के साथ किसी भी उपयोगकर्ता सहभागिता के बिना) ठीक से काम करने लगता है:

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 है कि बिल्कुल जरूरी नहीं है। हालांकि, यदि आप इसका उपयोग करते हैं तो आपको प्रमाणीकरण विफलता ("पासवर्ड प्रमाणीकरण अपवाद" के बजाय "प्रमाणीकरण अपवाद") के मामले में बहुत बेहतर त्रुटि संदेश प्राप्त होंगे।


तुम सच में सीधे निजी कुंजी का उपयोग करना चाहते हैं, तो आप निम्नलिखित कर सकता है:

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

मुझे यह त्रुटि आपके पहले दृष्टिकोण के साथ मिल रही है: कोई प्रमाणीकरण विधियां उपलब्ध नहीं हैं –