2012-01-23 5 views
7

मैं एक प्रक्रिया खोलने और plink चल के माध्यम से ग # से SSH कनेक्शन खोलना चाहते हैं। सभी आउटपुट एकत्र किए जाने चाहिए और परिणामों के आधार पर कार्यक्रम एसएसएच को कार्रवाई करेगा। मेरी बड़ी समस्या यह है कि यदि मैं अलग-अलग स्क्रिप्ट्स और मुझे (स्वचालित) उपयोगकर्ता इंटरैक्शन की आवश्यकता है तो मैं एक जोड़े का उपयोग कर रहा हूं। इसलिए मुझे सभी आउटपुट डेटा (मानक आउटपुट, मानक त्रुटि और कंसोल) पर कब्जा करना है।कब्जा सभी (stdout, stderr और CON) cmd साथ सी # plink को क्रियान्वित करने के निर्गम (बाहर std + अं ठीक है, CON काम नहीं कर रहा)

निम्न परीक्षण बैच को देखते हुए मामले को और अधिक स्पष्ट करना चाहिए:

1: @ECHO OFF 
2: ECHO StdOut 
3: ECHO StdErr 1>&2 
4: ECHO Cons>CON 

कोड की तरह है:

Process process; 
Process process; 
process = new Process(); 
process.StartInfo.FileName = @"cmd.exe"; 
process.StartInfo.Arguments = "/c test.bat"; 
process.StartInfo.UseShellExecute = false; 
process.StartInfo.ErrorDialog = false; 
process.StartInfo.CreateNoWindow = true; 
process.StartInfo.RedirectStandardOutput = true; 
process.StartInfo.RedirectStandardError = true; 
process.StartInfo.RedirectStandardInput = true; 
process.Start(); 
process.OutputDataReceived += new DataReceivedEventHandler(process_OutputDataReceived); 
process.ErrorDataReceived += new DataReceivedEventHandler(process_OutputDataReceived); 
process.BeginOutputReadLine(); 
process.BeginErrorReadLine(); 
StreamWriter inputWriter = process.StandardInput; 
[...] 

मैं लाइनों 2 + 3 पर कब्जा करने में सक्षम हूँ, लेकिन नहीं 4 (कुछ कार्यक्रमों द्वारा उपयोग किया जाता है)। मैंने cmd.exe की बजाय शुरुआती बिंदु के रूप में पावरहेल (या सीधे प्लग) की कोशिश की है, लेकिन एक ही परिणाम।

वहाँ सी # में किसी भी तरह के रूप में अच्छी सांत्वना बाहर कब्जा करने के लिए या आप किसी भी तीसरे पक्ष के कमांड लाइन पता stdout या कुछ इस तरह के लिए बाहर CON रीडायरेक्ट करने के लिए सक्षम किया जा रहा है है?

+0

मानक आउटपुट और कंसोल के बीच क्या अंतर है? –

+1

@DanielHilgarth मैं विंडोज के लिए पूरी तरह से निश्चित नहीं हूं, लेकिन यूनिक्स मानक आउटपुट पर कहीं भी निर्देशित किया जाएगा (फ़ाइल या कहीं भी नहीं), जबकि दूसरा हमेशा (टेक्स्ट मोड) कंसोल पर जाएगा। उदाहरण के लिए, यदि आप दूरस्थ रूप से लॉग इन हैं, तो दिखाता है। कंसोल आउटपुट हमेशा भौतिक कंसोल/कंप्यूटर पर जाता है (मुझे लगता है कि इसे बदलने के लिए कुछ विकल्प भी हैं, लेकिन आम तौर पर बोलते हैं)। –

उत्तर

3

AFAIK पता है कि आप क्या चाहते हैं (CON को पुनर्निर्देशित करना) केवल हुकिंग/इंजेक्शन द्वारा संभव है जो एसएसएच करने के लिए जटिल और मूल रूप से आवश्यक नहीं है।

SSH के लिए आप वहाँ सी # पुस्तकालयों के किसी भी संख्या (स्वतंत्र और वाणिज्यिक) का उपयोग कर सकते हैं:

एक पुस्तकालय का उपयोग करने का मुख्य लाभ यह है कि आप SSH सत्र की तुलना में आप कभी भी कुछ पुनः निर्देशित कंसोल के माध्यम से प्राप्त कर सकते थे और यह बहुत लागू करना आसान है पर बहुत अधिक नियंत्रण है कि है ...

अद्यतन - के अनुसार टिप्पणियाँ:

दूर से चल रहे कार्यक्रम आप एक पुस्तकालय जो एक "इंटरैक्टिव/टर्मिनल" SSH के लिए वर्ग के साथ आता है उपयोग करने की आवश्यकता से सभी उत्पादन प्राप्त करने के लिए - उदाहरण के लिए http://www.rebex.net/ssh-pack/default.aspx में एक इस तरह के एक वर्ग के साथ आता है और वास्तव में ठीक काम करता है (एफ़िलिएटेड नहीं, केवल एक खुश ग्राहक), इसे कोड-केवल घटक या दृश्य नियंत्रण के रूप में उपयोग किया जा सकता है (जो भी आपकी आवश्यकताओं के अनुरूप है)।

+1

+1 "लागू करने में आसान ..." और शायद अधिक मजबूत भी देखें। –

+0

पहले से ही SharpSSH का प्रयास किया है, लेकिन केवल std और त्रुटि का समर्थन करता है, कंसोल आउट नहीं करता है। Sshnet का परीक्षण करेगा, लेकिन वास्तव में optimisitc नहीं (बाद में परिणाम आपको बताएगा)। "आवश्यक नहीं" आवश्यक सामानों पर निर्भर करता है।मुझे कंसोल "gui" के साथ प्रोग्राम में उपयोगकर्ता इंटरैक्शन को स्वचालित करने के लिए एक प्रोग्राम की आवश्यकता है और यह केवल स्क्रीन पर लिखा गया है, न कि धाराओं के लिए। –

+0

@ याहिया: मुझे दूरस्थ रूप से चल रहे प्रोग्राम के आउटपुट की आवश्यकता है। अंत में यह मतलब है कि मैं के रूप में एक cmd.exe शीघ्र पर plink का उपयोग कर एक ही उत्पादन की जरूरत है ("क्या मैं खिड़कियों में देखते हैं") और फिर –

7

मुझे यकीन है कि यहां तक ​​कि संभव है नहीं कर रहा हूँ - अच्छी तरह से कम से कम कुछ सादे सरल एपीआई का उपयोग नहीं।

कृपया ध्यान दें कि मैं नहीं मिला है (हालांकि मैंने कोशिश की) वेब पर किसी भी जानकारी है कि सीधे पुष्टि की है कि, लेकिन यहाँ है कि कैसे मैं इस निष्कर्ष पर आते हैं।

Windows में सांत्वना अपनी ही सबसिस्टम, csrss.exe द्वारा प्रबंधित है (और Windows Vista भी conhost.exe के साथ शुरू है, लेकिन मैं पीछे हटना)। इसमें अपने स्वयं के सेट एपीआई हैं (AttachConsole, WriteConsole, आदि) और आपके पास प्रति प्रक्रिया केवल एक "कंसोल" हो सकती है।

दूसरी ओर CMD.EXE सिर्फ एक और कंसोल मोड आवेदन, कि सिर्फ कंसोल का उपयोग करने के लिए होता है और यह एक कंसोल विंडो शुरू किया जा रहा है। आप एक अलग कंसोल मोड एप्लिकेशन लॉन्च करके और प्रक्रिया पेड़ को देखकर इस प्रभाव को देख सकते हैं। प्रक्रिया एक्सप्लोरर: कोई सीएमडी.एक्सईई माता-पिता की प्रक्रिया नहीं है (बल्कि यह एक्सप्लोरर है या जिसे आप इसे शुरू करने के लिए इस्तेमाल करते हैं - पाठ्यक्रम सीएमडी.एक्सईई सहित)।

इस प्रकार अब तक मैं के बीच "कंसोल" और CMD.EXE, बैच फ़ाइलें, या सामान्य रूप में कंसोल मोड अनुप्रयोगों अंतर दिखाने के लिए कोशिश कर रहा था।

तो जब CMD.EXE में आप का उपयोग > CON आप वास्तव में एक ही प्रभाव देशी अनुप्रयोगों (या एक UNIX- जैसे ओएस पर /dev/console को अपने ठेठ लिख) में CONOUT$ करने के लिए एक लिखने कर के रूप में उत्पन्न कर रहे हैं। वहाँ प्रबंधित कोड के लिए एक सीधा समकक्ष (CMD.EXE में फ़ाइल वर्णनकर्ता के रूप में या 1 और 2) Console.Out और Console.Error बराबर stdout और stderr देशी अनुप्रयोगों के रूप में, होना करने के लिए प्रतीत नहीं होता।

जब आपने कोई प्रक्रिया शुरू की, तो आप केवल मानक आउटपुट और मानक त्रुटि धाराओं को पुनर्निर्देशित करने के लिए सक्षम हैं, लेकिन कंसोल (या CONOUT$ हैंडल) को लिखने वाले संदेशों को (प्रति सेकंड) को रीडायरेक्ट करने के लिए सक्षम हैं। मुझे लगता है कि आउटपुट को रीडायरेक्ट करने की कोशिश करने जैसा ही होगा, एक प्रक्रिया कुछ फाइल को लिखती है, जो भी (सामान्य रूप से) संभव नहीं है।

आप कंसोल आउटपुट को पकड़ने के लिए बच्चे की प्रक्रिया के अंदर कुछ हुकिंग या इंजेक्शन का उपयोग करके इसे प्राप्त कर सकते हैं।

आसानी से ऐसा करने में सक्षम नहीं होने के कारण, विंडोज़ के लिए एक पूर्ण टर्मिनल (यानी कंसोल विंडो, CMD.EXE!) प्रतिस्थापन क्यों नहीं लिख रहा है, यह आसानी से संभव नहीं है और कुछ हैक्स या वर्कअराउंड की आवश्यकता है ।

Universal Console Redirector

Redirecting an arbitrary Console's Input/Output

इसके अलावा, आदेश freopen के लिए एक कार्यक्रम की अनुमति देता है:

0

यहाँ कुछ CodeProject परियोजनाएं हैं जो ऐसा करते हैं (मूल कोड के माध्यम से) है, जो बेहतर सभी सांत्वना उत्पादन पुनः निर्देशित संभाल AFAICT हैं अपनी धाराओं को पुनर्निर्देशित करें। हालांकि, यदि कोई प्रोग्राम एक स्पष्ट WriteConsole() करता है तो मुझे यकीन नहीं है कि इसे पुनर्निर्देशित करना संभव है या नहीं।

+1

ये प्रोग्राम केवल स्टडी आउट और गलती दिखा रहे हैं, लेकिन –

+0

कंसोल नहीं है आप CONOUT को पुनर्निर्देशित करने के लिए फ्रीपेन का उपयोग करने का प्रयास कर सकते हैं; http://stackoverflow.com/questions/311955/redirecting-cout-to-a-console-in-windows –

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