इंटरप्रोसेस पाइप यातायात की निगरानी करें


13

मेरे पास दो लिनक्स प्रक्रियाएं हैं जो एक अनाम पाइप के माध्यम से संचार करती हैं। पाइप में यातायात की निगरानी कैसे कर सकते हैं? मैं पाइप में डेटा कैसे इंजेक्ट कर सकता हूं? मेरे पास रूट एक्सेस है और पाइप इनोड को जानते हैं।

जवाबों:


7

एक अनाम पाइप प्रकृति द्वारा उन अनुप्रयोगों के लिए निजी है जिनके पास फाइल डिस्क्रिप्टर है। पाइप पर यातायात को देखने या संशोधित करने के लिए कोई राजसी तरीका नहीं है। मुझे नहीं लगता कि लिनक्स पर सीधे पाइप को देखने का कोई तरीका है, या तो।

हालांकि, आप इसके बाद क्या कर रहे हैं, कम या ज्यादा करने का एक अप्रत्याशित तरीका है: ptrace सिस्टम कॉल के माध्यम से । आप पाइप पर प्रति सेगमेंट से नहीं निपटेंगे, लेकिन प्रक्रियाओं में से एक पर। अवलोकन के लिए, स्ट्रेस का उपयोग करें , उदा

strace -p1234 -s99999 -e write

जहां 1234एक प्रक्रिया की प्रक्रिया आईडी है जो पाइप पर लिखती है। डेटा को संशोधित करना कठिन है, लेकिन किया जा सकता है। मुझे लगता है कि सबसे आसान तरीका यह होगा कि पहले एक इंटरमीडिएट प्रक्रिया की स्थापना की जाए जो इसके मानक इनपुट को इसके मानक आउटपुट की प्रतिलिपि बनाती है, साथ ही आप जिस डेटा को इंजेक्ट करना चाहते हैं (और जिस भी डेटा को आप दबाना चाहते हैं उसे घटाएं)। दो नामित पाइप बनाएं और एक पाइप पर स्टड और दूसरे पर स्टडआउट के साथ उस मध्यवर्ती प्रक्रिया को शुरू करें। फिर उपयुक्त नाम पाइप पर दोनों लक्ष्य प्रक्रियाओं को निष्पादित करने के लिए डिबगर (जैसे GDB ) का उपयोग करें open, फिर dupपाइप को उपयुक्त फ़ाइल डिस्क्रिप्टर पर रखें। ध्यान दें कि एक मौका है कि आप इस प्रक्रिया में किसी एक प्रक्रिया को क्रैश कर देंगे।

(यदि आप अंतिम पैराग्राफ को नहीं समझते हैं, तो मुझे क्षमा करें, लेकिन इसके लिए एक निश्चित स्तर की तकनीकी की आवश्यकता है। मुझे नहीं लगता कि एक आसान तरीका है।)


धन्यवाद, मैं समझता हूं। मैंने वास्तव में कोशिश की / पीआईडी ​​/ $ पीआईडी ​​/ एफडी पर जा रहा हूं, जहां मुझे एक प्रक्रिया के अनाम पाइपों के लिए फ़ाइल प्रविष्टियां मिलीं और मैं शेल में सरल बिल्ली और गूंज का उपयोग करके पढ़ने और डेटा करने में कामयाब रहा, लेकिन व्यवहार कुछ हद तक असंगत। मुझे और जांच करने की जरूरत है।
जैकब

1
@ जेकब: ओह, मैंने सोचा कि यह पाइप के लिए काम नहीं करता। लेकिन जैसा कि आपको पता चला है कि ट्रैफिक की निगरानी के लिए यह आपकी बहुत मदद नहीं करेगा, क्योंकि निर्माता से प्रत्येक बाइट बिल्कुल एक उपभोक्ता के पास जाएगा और आप नियंत्रित नहीं कर सकते हैं कि आपका मॉनिटर या वास्तविक उपभोक्ता इसे प्राप्त करेगा या नहीं। आपको उस तरह से डेटा इंजेक्ट करने में सक्षम होना चाहिए।
गिल्स एसओ-

2

पाइप की निगरानी के लिए उपयोगी कुछ उपकरण:

पाइप व्यूअर
टी

पहले से चल रहे प्रोग्राम के लिए जहां कोई पाइपिंग को नियंत्रित नहीं करता है, जीडीबी विधि देखें:
रनिंग प्रोसेस से आउटपुट को रीडायरेक्ट करना

या कोई स्ट्रेस का उपयोग कर सकता है :

strace -ewrite -p $PID 2>&1 | grep "write(1"

केवल वर्णनकर्ता 1 कॉल दिखाता है। "2> और 1" stdout में stderr को पुनर्निर्देशित करना है, क्योंकि stearr डिफ़ॉल्ट रूप से stream लिखता है।


1
मेरा मतलब है कि पहले से चल रही प्रक्रिया के पाइप को वायरटैपिंग है। प्रक्रिया ए प्रक्रिया बी को लॉन्च करती है और एक पाइप के माध्यम से इसके साथ बात करती है इसलिए मेरे पास टी या पीवी जैसी प्रॉक्सी उपयोगिताओं का उपयोग करने का कोई तरीका नहीं है।
जैकब

कुछ और तरीके जोड़े।
harrymc

Grep का उपयोग करने के बजाय, आप f-1 को लिखे गए डेटा के आउटपुट को सीमित करने के लिए "-e write = 1" को निर्दिष्ट कर सकते हैं
विलियम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.