2012-06-06 5 views
5

मैं फ़ाइलों के पुनर्प्राप्ति को स्वचालित करने के लिए पाइथन (पैरामीको का उपयोग करके) से दूरस्थ सर्वर पर एसएफटीपी से कनेक्ट करने का प्रयास कर रहा हूं।कुंजी और उपयोगकर्ता नाम/पासवर्ड के साथ पैरामीको एसएफटीपी - "ओह, अनचाहे प्रकार 3"

सिस्टम संस्करण: ओएस: मैक ओएस एक्स शेर पायथन: 2.7.1 Paramiko: 1.7.7.2

मेरे सबसे छोटा उदाहरण:

key_file = '/absolute/path/to/.ssh/id_rsa_key' # NOT .pub 
key_passphrase = 'id_rsa_key_passphrase' 

host = 'ftp.test.com' 
port = 22 
username = 'my_ftp_username' 
password = 'my_ftp_password' 

# SSH Key 
my_key = paramiko.RSAKey.from_private_key_file(key_file, password=key_passphrase) 

# SFTP Connection 
transport = paramiko.Transport((host, port)) 
transport.connect(username=username, password=password, pkey=my_key) 
sftp = paramiko.SFTPClient.from_transport(transport) 

# Print something 
print sftp.listdir() 

# Close connections 
sftp.close() 
transport.close() 

ऊपर निम्नलिखित लॉग उत्पादन उत्पन्न करता है:

DEB [20120606-16:20:46.121] thr=1 paramiko.transport: starting thread (client mode): 0x8ae7dd0L 
INF [20120606-16:20:46.241] thr=1 paramiko.transport: Connected (version 2.0, client All) 
DEB [20120606-16:20:46.242] thr=1 paramiko.transport: kex algos:['diffie-hellman-group1-sha1', 'diffie-hellman-group-exchange-sha1'] server key:['ssh-rsa'] client encrypt:['aes256-cbc', 'aes192-cbc'] server encrypt:['aes256-cbc', 'aes192-cbc'] client mac:['hmac-sha1', 'hmac-sha1-96'] server mac:['hmac-sha1', 'hmac-sha1-96'] client compress:['none'] server compress:['none'] client lang:[''] server lang:[''] kex follows?False 
DEB [20120606-16:20:46.242] thr=1 paramiko.transport: Ciphers agreed: local=aes256-cbc, remote=aes256-cbc 
DEB [20120606-16:20:46.242] thr=1 paramiko.transport: using kex diffie-hellman-group1-sha1; server key type ssh-rsa; cipher: local aes256-cbc, remote aes256-cbc; mac: local hmac-sha1, remote hmac-sha1; compression: local none, remote none 
DEB [20120606-16:20:46.673] thr=1 paramiko.transport: Switch to new keys ... 
DEB [20120606-16:20:46.706] thr=2 paramiko.transport: Attempting password auth... 
DEB [20120606-16:20:47.112] thr=1 paramiko.transport: userauth is OK 
INF [20120606-16:20:50.288] thr=1 paramiko.transport: Authentication continues... 
DEB [20120606-16:20:50.288] thr=1 paramiko.transport: Methods: ['password', 'publickey'] 
DEB [20120606-16:20:50.305] thr=2 paramiko.transport: [chan 1] Max packet in: 34816 bytes 
WAR [20120606-16:20:50.405] thr=1 paramiko.transport: Oops, unhandled type 3 
INF [20120606-16:23:53.582] thr=1 paramiko.transport: Disconnect (code 11): Idle connection 

क्या किसी को पता है कि लॉग में "ओह, अनचाहे प्रकार 3" क्या है? ऐसा लगता है जब पूरी चीज अलग हो जाती है। वैकल्पिक रूप से, अगर कोई कुछ देखता है तो मैं कोड में बहुत गलत कर रहा हूं जो सहायक भी होगा।

+0

यह (अप्रत्याशित) बग आपके द्वारा देखे जा रहे मुद्दे को कवर करने के लिए प्रतीत होता है: https://github.com/paramiko/paramiko/issues/519 – Symmetric

उत्तर

1

आप सर्वर पर पासवर्ड और कुंजी प्रमाणीकरण दोनों का उपयोग कर रहे हैं, जो एक संघर्ष की तरह दिखता है। कनेक्ट करने के लिए Transport.auth_publickey विधि का उपयोग करने का प्रयास करें। यदि यह विफल रहता है, तो दस्तावेज़ अधिक जानकारी एकत्र करने के लिए transport.get_exception फ़ंक्शन का उपयोग करने के लिए कहते हैं।

संपादित करें:

this के अनुसार, multifactor प्रमाणीकरण दोनों एक पासवर्ड और एक कुंजी का उपयोग का मतलब है। इसलिए, फ़ंक्शन का उपयोग करने के लिए auth_password फ़ंक्शन का उपयोग करने में सक्षम होना चाहिए।

या, यदि आपके पास पर्याप्त पहुंच है, तो आप केवल FTP प्रमाणीकरण की आवश्यकता के लिए ftp सेटिंग्स को समायोजित कर सकते हैं।

क्या आपने filezilla जैसे किसी FTP क्लाइंट का उपयोग करके लॉग इन करने का प्रयास किया है?

+0

दिलचस्प। जब मैंने आपके द्वारा सुझाए गए पथ को आजमाया तो मुझे auth_publickey से लौटाई गई एक सरणी दिखाई देती है। वह सरणी ['पासवर्ड', 'publickey'] है। जब मैं आपके द्वारा लिंक किए गए दस्तावेज़ों को देखने के लिए जाता हूं (धन्यवाद) मैं देखता हूं कि लौटाया गया डेटा "प्रमाणीकरण के अगले चरण (आमतौर पर खाली) के लिए अनुमत लेखों की सूची है"। आपको यह नहीं पता होगा कि मल्टी-स्टेज प्रमाणीकरण प्रक्रिया पर दस्तावेज़ कहां है, या यहां तक ​​कि एक उदाहरण/ट्यूटोरियल, क्या आप? – rebekswr

+0

@rebekswr ठीक है, मैंने मल्टी-स्टेज प्रमाणीकरण पर कुछ सामान के साथ अपना जवाब अपडेट कर लिया है। –

+0

मैंने दोनों कॉलों की कोशिश की, दोनों संभावित आदेशों में और दोनों ने हमेशा एक ही आउटपुट को एक दूसरे के रूप में दिया और जब मैंने कहा कि बाद में I_ प्रमाणीकृत किया गया था, तो मैं कभी नहीं था। मैं एक कमांड लाइन से sftp को कॉल करने के लिए आगे बढ़ रहा हूं क्योंकि मुझे पोर्टेबल होने की आवश्यकता नहीं है। आपकी सहायता के लिए बहुत - बहुत धन्यवाद। – rebekswr

0

समस्या इस तथ्य से आ रही है कि आप आरएसए कुंजी प्रारूप (key_file = '/absolute/path/to/.ssh/id_rsa_key') का उपयोग कर रहे हैं।

सुनिश्चित करें कि आप इसे पुटी कुंजी जनरेटर का उपयोग करके एसएसएच आरएसए में परिवर्तित करें। मैंने किया और उसी कोड का उपयोग किया: यह काम कर रहा है।

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