c# - सभी सीडी(सीडीडी, सीडीडीआर और कोंक) सीडीडी के सीआईडी ​​के साथ सीमेंट को चलाने के लिए सी#(एसटीडी आउट+एरिक ओके, सीएनएन काम नहीं करना) कैप्चर करें




shell redirect (2)

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

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

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 नहीं (कुछ प्रोग्राम द्वारा उपयोग किया गया) मैंने सीएमडी.एक्सई के बजाय शुरुआती बिंदु के रूप में शक्तिशेल (या सीधे लिपिक) की कोशिश की है, लेकिन उसी परिणाम

क्या कंसोल को बाहर निकालने के लिए सी # में कोई भी तरीका है या क्या आपको पता है कि किसी तीसरे पक्ष के कमांड लाइन को सीडी को स्टडआउट या इस तरह से कुछ रीडायरेक्ट करने में सक्षम है?


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

एसएसएच के लिए आप किसी भी संख्या में सी # लाइब्रेरीज़ का उपयोग कर सकते हैं (निःशुल्क और वाणिज्यिक):

लाइब्रेरी का उपयोग करने का मुख्य लाभ यह है कि आपके द्वारा एसएसएच सत्र पर अधिक से अधिक नियंत्रण है, आप कुछ रीडायरेक्ट कन्सोल से प्राप्त कर सकते हैं और इसे लागू करना बहुत आसान है ...

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

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


मुझे यकीन नहीं है कि यह भी संभव है - कम से कम कुछ सादे सरल API का उपयोग न करें।

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

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

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

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

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

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

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

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





capture