2010-05-20 19 views
8

पर आदेश भेजें मैं विंडोज एक्सपी पर जावा का उपयोग कर रहा हूं और टेलनेट जैसे किसी अन्य प्रोग्राम को कमांड भेजना चाहता हूं। मैं बस एक और प्रोग्राम निष्पादित नहीं करना चाहता हूं। मैं इसे निष्पादित करना चाहता हूं, और उसके बाद इसे चलाने के बाद इसे आदेशों का अनुक्रम भेजना चाहता हूं। यहां मेरा कोड है जो मैं करना चाहता हूं, लेकिन यह काम नहीं करता है: (यदि आप "cmd" को कमांड को बदलते हैं और बदलते हैं तो यह अपेक्षित काम करता है। कृपया मदद करें।) यह एक सरलीकृत उदाहरण है। उत्पादन में कई और आदेश भेजे जाएंगे, इसलिए कृपया "टेलनेट लोकहोस्ट" को कॉल करने का सुझाव न दें।जावा में, अन्य कमांड लाइन प्रोग्राम

try 
    { 
     Runtime rt = Runtime.getRuntime(); 

     String command = "telnet"; 
     //command = "cmd"; 
     Process pr = rt.exec(command); 

     BufferedReader processOutput = new BufferedReader(new InputStreamReader(pr.getInputStream())); 
     BufferedWriter processInput = new BufferedWriter(new OutputStreamWriter(pr.getOutputStream())); 

     String commandToSend = "open localhost\n"; 
     //commandToSend = "dir\n" + "exit\n"; 

     processInput.write(commandToSend); 
     processInput.flush(); 

     int lineCounter = 0; 
     while(true) 
     { 
      String line = processOutput.readLine(); 
      if(line == null) break; 
      System.out.println(++lineCounter + ": " + line); 
     } 

     processInput.close(); 
     processOutput.close(); 
     pr.waitFor(); 
    } 
    catch(Exception x) 
    { 
     x.printStackTrace(); 
    } 
+0

तो आप जावा के लिए एक इंटर प्रोसेस संचार समाधान चाहते हैं? – Justin

+0

ऐसा लगता है जैसे टेलनेट प्रक्रिया के इनपुट स्ट्रीम के अलावा किसी अन्य चीज़ को अपना आउटपुट लिख रहा है, और जावा इसे कैप्चर नहीं कर रहा है। Process.getInputStream() एकमात्र तरीका है जो पढ़ने के लिए एक प्रक्रिया है? – bradvido

उत्तर

3

यह ठीक दिखता है, क्योंकि यह इतना उत्पादन नहीं कर रहा है, लेकिन आपको वास्तव में अलग-अलग थ्रेड में पढ़ना और लिखना चाहिए ताकि यह बफर भरने और ब्लॉक को अगले चरण तक पहुंचने से पहले पढ़ने के लिए प्रतीक्षा न करे ।

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

उदाहरण के लिए, echo dir c:\ | cmd सीएमडी चलाने के लिए कारण बनता है, सी: ड्राइव सामग्री और बाहर निकलें, वही व्यवहार जैसा कि आपने कंसोल में dir c:\ टाइप किया है। लेकिन echo open localhost | telnet टेलनेट को स्क्रीन को साफ़ करने का कारण बनता है, उसी तरह व्यवहार करने के बजाए, जैसे कि आपने इसे कंसोल में टाइप किया है। चूंकि टेलनेट को पासवर्ड के लिए उपयोगकर्ता इनपुट मास्क करने की आवश्यकता होती है, इसलिए यह काफी संभावना है कि यह मानक इनपुट से पढ़ने के बजाय console API का उपयोग कर रहा है। यह help मानक इनपुट से पढ़ने के लिए कहने के लिए किसी भी कमांड तर्क की सूची नहीं देता है, इसलिए शायद आपको एक टेलनेट कार्यान्वयन का उपयोग करने की आवश्यकता है जो स्क्रिप्टिंग के लिए बेहतर अनुकूल है।

+0

मैं सहमत हूं। यह मेरी समस्या दिखाने के लिए एक सरलीकृत उदाहरण है, इसलिए मैंने इसे एकल धागा रखा। क्या आप कृपया मानक इनपुट बनाम कंसोल और पाठ को पाइप करके क्या मतलब समझ सकते हैं? – bradvido

+0

@ ब्रैडविडो वेल, 'खुला स्थानीयहोस्ट गूंजें | टेलनेट 'काम नहीं करता है लेकिन' echo dir c: | cmd' करता है, इसलिए मुझे दृढ़ता से संदेह है कि विंडोज टेलनेट क्लाइंट कंसोल एपीआई का उपयोग अपने इनपुट स्ट्रीम को पढ़ने के बजाय कीप्रेस का पता लगाने के लिए कर रहा है। –

+0

मैं इसे अब देखता हूं। यह स्पष्ट रूप से समस्या है जिसमें मैं दौड़ रहा हूं। क्या आपको कोई जानकारी है कि मैं इनपुट स्ट्रीम के बजाय एप्लिकेशन के कंसोल पर कैसे लिख सकता हूं? – bradvido

3

यह सीधे अपने प्रश्न का उत्तर नहीं है, लेकिन ...

इसके बजाय Runtime.exec() का उपयोग कर आप एक ProcessBuilder का उपयोग करें और stderr stdout ( ProcessBuilder.redirectErrorStream(true)) की ओर ही रीडायरेक्ट की

। अन्यथा यदि आपकी प्रक्रिया stderr पर कुछ लिखती है तो आपकी प्रक्रिया अवरुद्ध हो सकती है (जब प्रक्रिया की आउटपुट पढ़ी नहीं जाती है तो विंडोज इसे पसंद नहीं करता है)।

+0

यह "प्रत्यक्ष उत्तर" के बहुत करीब है - आप प्रक्रिया शुरू कर सकते हैं और 'Process.getOutputStream()' से आउटपुट पढ़ सकते हैं और 'Process.getInputStream() ' –

+0

पर आदेश लिख सकते हैं मैंने कोशिश की, और मुझे एक ही समस्या है । दूरभाष से उत्पादन पढ़ा नहीं जाता है। प्रोग्राम कुछ भी प्रिंट किए बिना निष्पादित करता है। – bradvido

+3

जावा में आपके कोड के दृष्टिकोण से, डी। शॉली ने जो कुछ लिखा, उसमें एक छोटा सा सुधार, वास्तव में ** ** ** Process.getInputStream() 'और ** ** Process.getOutputStream() से लिखें। '...नामकरण भ्रमित है, उन्हें स्पष्ट रूप से एक अलग बिंदु से नामित किया गया था ... –

2

यदि आप जावा से प्रोग्रामेटिक रूप से एक टेलनेट सत्र को नियंत्रित करना चाहते हैं, तो आप इस Java telnet library का उपयोग करने में सक्षम हो सकते हैं ... आप वही काम कर सकते हैं (खुले कनेक्शन, उपयोगकर्ता नाम/पासवर्ड भेज सकते हैं, आदेश भेज सकते हैं और परिणाम प्राप्त कर सकते हैं) लेकिन बिना वास्तव में एक अलग प्रक्रिया पैदा करना।

+0

टेलीेंट बस एक उदाहरण के लिए था। मुझे यह सामान्य होने की आवश्यकता है ताकि मैं किसी निष्पादन योग्य को निष्पादित कर सकूं और इसे कमांड लिख सकूं – bradvido

1

आप Telnet Ant task पर एक नज़र डाल सकते हैं, तो आप इसे build.xml फ़ाइल का उपयोग करने के लिए सीधे अपने कोड में कॉल कर सकते हैं।

आप source code पर भी एक नज़र डाल सकते हैं और देख सकते हैं कि वे इसे कैसे करते हैं।

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