स्टैक ओवरफ्लो के लिए नया, तो पहले बंद करें, हैलो।एसएसएच बिना आरएसए कुंजी के पाइथन का उपयोग
मैं अपने स्कूल के लिए एक छोटी सी परियोजना पर काम कर रहा हूं जो ओपन सोर्स यूनिसन प्रोग्राम के लिए एक कस्टम गुई (मेरे लिए एक शैक्षिक चुनौती के रूप में लिखा गया है क्योंकि मैंने कभी भी पाइथन का उपयोग नहीं किया है) माना जाता है। हम छात्रों और कर्मचारियों को इस कार्यक्रम को जितना संभव हो सके उतने इनपुट के साथ लॉन्च करके घर और स्कूल में एक फ़ोल्डर को सिंक करने की कोशिश कर रहे हैं (बेवकूफ-प्रमाणन यदि आप करेंगे)। इंटरफेस सिर्फ स्कूल उपयोगकर्ता नाम और पासवर्ड होना चाहिए और गुई रैपर को यूनिसेन को उपयोगकर्ता नाम और पासवर्ड भेजना चाहिए और उन्हें सिंक करना चाहिए।
समस्या यह है कि यूनिसन ने एसएसएच लॉन्च किया और पासवर्ड के लिए संकेत दिया लेकिन पायथन 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 और लिनक्स के विकास कर रहा हूँ, मैं अंत में के बाद से मेरे स्कूल के छात्रों में से अधिकांश के रूप में खिड़कियों चलाने इस खिड़कियों संगत बनाने के लिए होगा उनके प्राथमिक (या केवल) मशीन।
मैंने अभी इस परियोजना के साथ अपने प्रोजेक्ट का परीक्षण करने की कोशिश की है (जाहिर है कि वास्तव में एक वास्तविक मेजबान के साथ) और कुछ भी नहीं होता है। थोड़ा विराम दें और फिर किसी संदेश के साथ बैश प्रॉम्प्ट पर वापस जाएं। मैंने अपने उपरोक्त कोड से पूरी निष्पादन लाइन जोड़ने की कोशिश की, शायद यह बंद हो जाता है अगर इसे कुछ भी नहीं दिया जाता है, लेकिन यह वही काम करता है। – Hiroshi
सुनिश्चित करें कि आप जिस बच्चे को पास करते हैं वह तर्क है। एक्सपेक्ट() उस पासवर्ड प्रॉम्प्ट से मेल खाता है जो सर्वर आपको देता है। इसके अलावा, आपको child.sendline (mypassword) के बाद child.interact() को कॉल करने की आवश्यकता हो सकती है। यह थोड़ी देर के बाद से मैंने pexpect का उपयोग किया, लेकिन यह नौकरी के लिए उपकरण है। –
काम किया! धन्यवाद! :) – Hiroshi