2012-05-11 12 views
5

स्टैक ओवरफ्लो के लिए नया, तो पहले बंद करें, हैलो।एसएसएच बिना आरएसए कुंजी के पाइथन का उपयोग

मैं अपने स्कूल के लिए एक छोटी सी परियोजना पर काम कर रहा हूं जो ओपन सोर्स यूनिसन प्रोग्राम के लिए एक कस्टम गुई (मेरे लिए एक शैक्षिक चुनौती के रूप में लिखा गया है क्योंकि मैंने कभी भी पाइथन का उपयोग नहीं किया है) माना जाता है। हम छात्रों और कर्मचारियों को इस कार्यक्रम को जितना संभव हो सके उतने इनपुट के साथ लॉन्च करके घर और स्कूल में एक फ़ोल्डर को सिंक करने की कोशिश कर रहे हैं (बेवकूफ-प्रमाणन यदि आप करेंगे)। इंटरफेस सिर्फ स्कूल उपयोगकर्ता नाम और पासवर्ड होना चाहिए और गुई रैपर को यूनिसेन को उपयोगकर्ता नाम और पासवर्ड भेजना चाहिए और उन्हें सिंक करना चाहिए।

समस्या यह है कि यूनिसन ने एसएसएच लॉन्च किया और पासवर्ड के लिए संकेत दिया लेकिन पायथन subprocess.communicate (इनपुट) विधि एसएसएच पासवर्ड लेने नहीं देगी। मुझे एहसास हुआ कि एसएसएच केवल टर्मिनल से इनपुट स्वीकार करेगा और मैं यह नहीं समझ सकता कि इसे कैसे चालित किया जाए। मैंने छद्म टर्मिनल का उपयोग करने के बारे में कुछ सामान पढ़ा है लेकिन मैं अभी भी स्टंप हूं। आरएसए कुंजी आदर्श समाधान होगा, लेकिन उन्हें उत्पन्न करने और फिर उन्हें रिमोट सर्वर पर रखने के लिए मुझे अभी भी कम से कम एक बार पासवर्ड से लॉगिन करने की आवश्यकता है और इसके लिए उपरोक्त समाधान, या टर्मिनल जो बेवकूफ प्रमाण नहीं है, के लिए एक समाधान की आवश्यकता होगी। अगर मैं इसे में पेस्ट करें। और किसी भी सामान्य अजगर सुझावों भी सराहना की होगी अगर आप इच्छुक हैं तो

def startSync(self): 
    ''' 
    ''' 
    userName = self.userNameIn.get() 
    userPass = self.userPassIn.get() 
    localDir = "/Users/localuser/syncFolder/" 
    remoteDir = " ssh://schoolServer/remotesyncFolder" #for testing purposes, I set this to my own home machine which logs into my own account if I don't provide [email protected] 
    unisonExecRemotePath = " -servercmd /Users/RemoteMe/unison" #unison is the unix executable responsible for launching unison on the remote system 
    silenceCmdPrompts = " -silent" #keeps unison from displaying directory differences and asking if its okay to sync 
    executionString = "./unison" + localDir + remoteDir + unisonExecRemotePath + silenceCmdPrompts 

    mainProcess = subprocess.Popen(executionString,shell = True, stdin = subprocess.PIPE) 
    mainProcess.communicate(userPass) 

निष्पादन तार वहाँ टर्मिनल में ठीक काम करता है।

धन्यवाद!

यूनिसन प्रयोक्ता मैनुअल: http://www.cis.upenn.edu/~bcpierce/unison/download/releases/stable/unison-manual.html

संपादित करें: मैं भी ध्यान देना चाहिए कि जब तक मैं वर्तमान में नीचे OSX और लिनक्स के विकास कर रहा हूँ, मैं अंत में के बाद से मेरे स्कूल के छात्रों में से अधिकांश के रूप में खिड़कियों चलाने इस खिड़कियों संगत बनाने के लिए होगा उनके प्राथमिक (या केवल) मशीन।

उत्तर

3

pexpect पर देखें।

import pexpect 

child = pexpect.spawn('ssh [email protected]') 
child.expect('Password:') 
child.sendline(mypassword) 
child.interact() 
+0

मैंने अभी इस परियोजना के साथ अपने प्रोजेक्ट का परीक्षण करने की कोशिश की है (जाहिर है कि वास्तव में एक वास्तविक मेजबान के साथ) और कुछ भी नहीं होता है। थोड़ा विराम दें और फिर किसी संदेश के साथ बैश प्रॉम्प्ट पर वापस जाएं। मैंने अपने उपरोक्त कोड से पूरी निष्पादन लाइन जोड़ने की कोशिश की, शायद यह बंद हो जाता है अगर इसे कुछ भी नहीं दिया जाता है, लेकिन यह वही काम करता है। – Hiroshi

+0

सुनिश्चित करें कि आप जिस बच्चे को पास करते हैं वह तर्क है। एक्सपेक्ट() उस पासवर्ड प्रॉम्प्ट से मेल खाता है जो सर्वर आपको देता है। इसके अलावा, आपको child.sendline (mypassword) के बाद child.interact() को कॉल करने की आवश्यकता हो सकती है। यह थोड़ी देर के बाद से मैंने pexpect का उपयोग किया, लेकिन यह नौकरी के लिए उपकरण है। –

+0

काम किया! धन्यवाद! :) – Hiroshi

2

आप ssh के लिए एक पासवर्ड भेजना चाहते हैं आप pseudoterminal खोलने (एक pty) और का उपयोग कर इसे से बात करने की जरूरत है कि बजाय सिर्फ stdin/stdout का उपयोग करने का। pexpect मॉड्यूल पर एक नज़र डालें, जिसे ठीक से करने के लिए डिज़ाइन किया गया है।

एक वैकल्पिक समाधान में सार्वजनिक कुंजी वितरित करने के लिए कुछ प्रकार के आउट-ऑफ-बैंड तंत्र शामिल होंगे: उदाहरण के लिए, एक साधारण वेब एप्लिकेशन स्थापित करें जहां लोग सार्वजनिक कुंजी में पेस्ट कर सकते हैं और इसे authorized_keys फ़ाइल की ओर से प्रबंधित कर सकते हैं उपभोक्ता।

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