2011-10-06 12 views
9

पृष्ठभूमि: मैं अजगर और paramiko उपयोग कर रहा हूँ प्रक्रिया मैं हर मैं एक वर्ग के लिए एक कार्यक्रम में सौंपने के लिए है के माध्यम से जाना स्वचालित करने के लिए। हम स्रोत कोड सबमिट करने के लिए "हैंडिन" नामक एक कमांड का उपयोग करते हैं, लेकिन यह एक स्कूल कंप्यूटर से किया जाना चाहिए। तो जब मैं घर से कोड जमा करता हूं, तो मुझे स्कूल सर्वरों में एसएफटीपी करना होगा, फाइलों को डीआईआर, एसएसएच स्कूल कंप्यूटर में डालें, 'हैंडिन' कमांडअजगर paramiko स्क्रिप्ट, exec_command दौरान उत्पादन पढ़ने समस्याओं()

मैं सफलतापूर्वक स्कूल मशीनों पर फाइलों को डाल सकता हूं। समस्या तब होती है जब मैं exec_command ('मेरी फ़ाइलें हैंडिन') का उपयोग करने का प्रयास करता हूं और फिर अगली कार्रवाई निर्धारित करने के लिए आउटपुट पढ़ता है।

तो मैं

try: 
    (stdin, stdout, stderr) = client.exec_command(s) 
except: 
    print 'whoops' 
    sys.exit() 
print stdout.readlines() 

है लेकिन यह किसी कारण के लिए एक गतिरोध का कारण बनता है, स्क्रिप्ट कुछ नहीं कर प्रतीत होता है और मैं अंत में पूरी प्रक्रिया (Ctrl + C does not काम) को मारने के लिए की है। मुझे यकीन नहीं है कि exec_command सही तरीके से पूरा नहीं कर रहा है (भले ही यह कोशिश/पकड़ ब्लॉक से बाहर हो रहा हो) या यदि मुझे नेटवर्क समस्याएं हैं या क्या।

कोई विचार?

अद्यतन:

समस्या निष्पादन के दौरान handin आदेश के साथ बातचीत के साथ है। आदेश को निष्पादित करने के बाद, हैंडिन अभी भी चल रहा है या नहीं भी हो सकता है। अगर इसे पहली बार सबमिट करना सफलतापूर्वक कहता है, ब्ला ब्लाह, और निष्पादन खत्म हो जाता है। सब ठीक हैं। लेकिन अगर मैं पुनः सबमिट कर रहा हूं तो मुझे प्रत्येक फ़ाइल के लिए ओवरराइट (stdin.write ('y')) को अधिकृत करना होगा।

टीएल/डॉ:

मैं कैसे अगर एक exec_command() अभी भी चल रहा है, निवेश के लिए इंतजार कर रहे हैं, और ReadLine() तदनुसार stdout से जांच कैसे करूं?

+0

क्या आपके पास टीएल/डीआर का समाधान है? इनपुट के लिए प्रतीक्षा करने से पहले मैं पाठ को कैसे जान सकता हूं उदा। @ पासवर्ड ... –

उत्तर

5

समस्या यह हो सकती है कि रिमोट कमांड इनपुट की प्रतीक्षा कर रहा है (यह आपको उम्मीद है कि आप stdin को कुछ लिखना चाहते हैं, यह नहीं जानते कि आप तब तक नहीं जा रहे हैं जब तक आप ऐसा नहीं कहें)। stdin.channel.shutdown_write() (मुझे विश्वास है कि stdin.close() स्वयं ही चाल नहीं करेगा: इससे केवल फ्लश नहीं होगा)

+0

जो मुझे जांचने के लिए एक रीडलाइन करने की आवश्यकता है। यदि आप कई बार सौंपते हैं तो यह आपको पूछता है कि क्या आप प्रत्येक फ़ाइल के लिए [y/N] को ओवरराइट करना चाहते हैं, यदि पहली बार इसे आगे इनपुट की आवश्यकता नहीं है। Exec_command के दौरान आउटपुट के लिए मैं कैसे जांचूं? – macgregor

+0

stdout.readlines() वास्तव में ssh कमांड के आउटपुट को पढ़ रहा है, स्क्रिप्ट से 'पढ़ना' इनपुट नहीं और इसे ssh कमांड पर भेज रहा है। ऐसा करने के लिए आपको stdin.write() की आवश्यकता है। – bdk

+0

मुझे इसके बारे में पता है, आप गलत समझते हैं।मैंने अपनी मूल पोस्ट अपडेट की है, हो सकता है कि – macgregor

8

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

import paramiko 
ssh=paramiko.SSHClient() 
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
ssh.connect('<ip address here>',username='<username here>',password='<password here>') 
stdin,stdout,stderr = ssh.exec_command("ls /") 
print stdout.readlines() 

है कि आप के लिए काम करता है मेरी अगली सुझाव वास्तविक handin आदेश आप को चलाने के लिए कोशिश कर रहे हैं के साथ 'ls /' की जगह की कोशिश करना होगा। यह संभव है कि कमांड उपयोगकर्ता इनपुट के लिए प्रतीक्षा कर रहा है, आदि

+0

पर चीजों को साफ़ कर दें, हाँ, ठीक है, बुनियादी आदेश काम करते हैं। मैं कमांड निष्पादन – macgregor

+0

के दौरान अगली इनपुट करने के बारे में जानने के लिए रीडलाइन का उपयोग करने का प्रयास कर रहा हूं, इसके बाद लगभग निश्चित रूप से आपका हैंडिन कमांड। यह इंटरेक्टिव व्यवहार की अपेक्षा करता है। इस उदाहरण को देखें जो लिंक में 'सूडो डीएमएसजी' का उपयोग करता है और इसलिए पासवर्ड प्रॉम्प्ट का जवाब देना पड़ता है: http://jessenoller.com/2009/02/05/ssh-programming-with-paramiko-completely-different/ – bdk

+0

ठीक है, हालांकि मुझे यह गतिशील रूप से करने की ज़रूरत है। कमांड निष्पादन के दौरान stdout पढ़ने का कोई तरीका है यह जांचने के लिए कि मुझे कितनी बार 'y' – macgregor

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