pysftp

2016-08-14 2 views
25

के साथ होस्ट कुंजी सत्यापित करें मैं pysftp का उपयोग कर एक प्रोग्राम लिख रहा हूं, और यह C:\Users\JohnCalvin\.ssh\known_hosts के विरुद्ध एसएसएच होस्ट कुंजी को सत्यापित करना चाहता है।pysftp

पुटी का उपयोग करके, टर्मिनल प्रोग्राम इसे रजिस्ट्री [HKEY_CURRENT_USER\Software\SimonTatham\PuTTY\SshHostKeys] पर सहेज रहा है।

मैं pysftp और PUTTY के बीच अंतर को कैसे जोड़ूं?

मेरे कोड है:

त्रुटि प्रतिक्रिया मैं प्राप्त कर रहा है:

E:\Program Files (x86)\Anaconda3\lib\site-packages\pysftp__init__.py:61: UserWarning:
Failed to load HostKeys from C:\Users\JohnCalvin.ssh\known_hosts.
You will need to explicitly load HostKeys (cnopts.hostkeys.load(filename)) or disableHostKey checking (cnopts.hostkeys = None). warnings.warn(wmsg, UserWarning) Traceback (most recent call last): File "E:\OneDrive\Python\GIT\DigitalCloud\pysftp_tutorial.py", line 14, in push_file_to_server() File "E:\OneDrive\Python\GIT\DigitalCloud\pysftp_tutorial.py", line 7, in push_file_to_server s = sftp.Connection(host='138.99.99.129', username='root', password='********') File "E:\Program Files (x86)\Anaconda3\lib\site-packages\pysftp__init__.py", line 132, in init self._tconnect['hostkey'] = self._cnopts.get_hostkey(host) File "E:\Program Files (x86)\Anaconda3\lib\site-packages\pysftp__init__.py", line 71, in get_hostkey raise SSHException("No hostkey for host %s found." % host) paramiko.ssh_exception.SSHException: No hostkey for host 138.99.99.129 found. Exception ignored in: > Traceback (most recent call last): File "E:\Program Files (x86)\Anaconda3\lib\site-packages\pysftp__init__.py", line 1013, in del self.close() File "E:\Program Files (x86)\Anaconda3\lib\site-packages\pysftp__init__.py", line 784, in close if self._sftp_live: AttributeError: 'Connection' object has no attribute '_sftp_live'

+0

मदद करता है आप ['pysftp'] (https://pypi.python.org/pypi/pysftp) में अपनी समस्या का उत्तर पा सकते हैं [दस्तावेज़ीकरण] (http://pysftp.readthedocs.io/) जो इस मुद्दे का स्पष्ट रूप से उल्लेख करता है [यहां] (http://pysftp.readthedocs.io/en/release_0.2.9/cookbook.html#pysftp-cnopts)। –

उत्तर

25

निम्नलिखित समाधान मेरे लिए काम किया:

import pysftp 
cnopts = pysftp.CnOpts() 
cnopts.hostkeys = None 
with pysftp.Connection(host, username, password, cnopts=cnopts) as sftp: 
    sftp.put(local_path, remote_path) 

आप यहाँ और अधिक जानकारी प्राप्त कर सकते : https://stackoverflow.com/a/38355117/1060738

+1

हां, इस तरह मैंने अंततः अपनी समस्या का समाधान किया। लेकिन ऐसा करने से यह केवल होस्ट कुंजी को अनदेखा करता है। मैं वास्तविक कुंजी को पढ़ कर सुरक्षा (यदि संभव हो) को बनाए रखने में सक्षम होना चाहता हूं। –

+3

एक त्वरित नोट। यदि आपके पास पथ में खाली ज्ञात_होस्ट फ़ाइल है तो CnOpts() विफल हो जाएगी। –

+0

यह अनदेखा करने के लिए भी मेरे लिए काम किया, लेकिन क्या आपने मेजबान कुंजी को रखकर सुरक्षा को बनाए रखने का तरीका बताया? –

1

नमस्ते अगर हम आपको अच्छी तरह समझते हैं तो हम एक ही समस्या का सामना करते हैं। तो जांचें कि आप किस pysftp संस्करण का उपयोग कर रहे हैं। यदि यह नवीनतम है जो 0.2.9 डाउनग्रेड 0.2.8 है। इसे देखें। https://github.com/Yenthe666/auto_backup/issues/47

+0

लोगों को परिणामों की व्याख्या किए बिना सुरक्षा सुविधा को बाईपास करने का सुझाव न दें! आप [एमआईटीएम हमलों] के खिलाफ सुरक्षा खो रहे हैं (https://en.wikipedia.org/wiki/Man-in-the-middle_attack)। –

10

विश्वसनीय होस्ट कुंजी प्रबंधित करने के लिए CnOpts.hostkeys (HostKeys लौटाता है) का उपयोग करें।

cnopts = pysftp.CnOpts() 
cnopts.hostkeys.load('known_hosts') 

with pysftp.Connection(host, username, password, cnopts=cnopts) as sftp: 

जहां known_hosts एक सर्वर सार्वजनिक कुंजी [एस] की तरह एक प्रारूप में शामिल हैं:

example.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQAB... 

आप एक बाहरी फ़ाइल का उपयोग नहीं करना चाहते हैं, तो आप भी उपयोग कर सकते हैं

keydata = b"""AAAAB3NzaC1yc2EAAAADAQAB...""" 
key = paramiko.RSAKey(data=decodebytes(keydata)) 
cnopts = pysftp.CnOpts() 
cnopts.hostkeys.add('example.com', 'ssh-rsa', key) 

with pysftp.Connection(host, username, password, cnopts=cnopts) as sftp: 

एक आसान वा इस प्रारूप में मेजबान कुंजी को पुनः प्राप्त करने के लिए y OpenSSH ssh-keyscan उपयोग कर रहा है:

$ ssh-keyscan example.com 
# example.com SSH-2.0-OpenSSH_5.3 
example.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQAB... 

तुम भी एक ही प्राप्त कर सकते हैं बस AutoAddPolicy का उपयोग करके:

client.load_host_keys(os.path.expanduser('~/.ssh/known_hosts')) 
client.set_missing_host_key_policy(paramiko.client.AutoAddPolicy) 

यह स्वचालित रूप से करने के लिए नए known_hosts सेनाओं के मेजबान कुंजी जोड़ देगा , लेकिन ज्ञात होस्ट कुंजी के लिए, यह एक बदली हुई कुंजी स्वीकार नहीं करेगा। load_host_keys के बिना, यह किसी भी मेजबान कुंजी को अंधाधुंध स्वीकार करता है, इसलिए सुनिश्चित करें कि आप load_host_keys पर कॉल करें।


हालांकि एक पूर्ण सुरक्षा के लिए, आप दूरस्थ मेजबान कुंजी को पुनः प्राप्त नहीं करना चाहिए, जैसा कि आप यकीन है कि, अगर आप पहले से ही हमला नहीं किया जा रहा है नहीं हो सकता।

मेरा आलेख देखें Where do I get SSH host key fingerprint to authorize the server?
यह मेरे विनससीपी एसएफटीपी क्लाइंट के लिए है, लेकिन अधिकांश जानकारी सामान्य रूप से मान्य है।


आप केवल अपने फिंगरप्रिंट का उपयोग कर होस्ट कुंजी को सत्यापित करने की जरूरत है, Python - pysftp/paramiko - Verify host key using its fingerprint देखते हैं।

+1

यह विधि मेरे लिए काम किया। –

-1

ज्ञात_होस्ट फ़ाइल का उपयोग करने वाले Windows ssh क्लाइंट के साथ पहले सर्वर से कनेक्ट करें। PuTTy विंडोज रजिस्ट्री में डेटा संग्रहीत करता है, हालांकि OpenSSH ज्ञात_होस्ट फ़ाइल का उपयोग करता है, और कनेक्ट होने के बाद वहां प्रविष्टियां जोड़ देगा। फ़ाइल के लिए डिफ़ॉल्ट स्थान% USERPROFILE% .ssh है। मुझे उम्मीद है कि यह

+0

असहज टिप्पणी। क्या आपने सवाल पढ़ा? मैं pysftp और पुटी के बीच अंतर कैसे मिल सकता है? –

संबंधित मुद्दे