2011-08-23 5 views
7

मैं इस तरह एक उपप्रक्रिया में tcpdump चला रहा हूँ के बाद एक tcpdump उपप्रक्रिया से stdout करना:समाप्त यह

pcap_process = subprocess.Popen(['tcpdump', '-s 0', '-w -', 'tcp'], 
            stdout=subprocess.PIPE, stderr=subprocess.PIPE) 

-w - तर्क महत्वपूर्ण है: यह tcpdump बताता stdout के परिणामस्वरूप .pcap फ़ाइल को मुद्रित करने के लिए।

मैं urllib.open() का उपयोग कर वेबसाइट तक पहुंचने के लिए जाता हूं। ऐसा करने के बाद, मैं tcpdump को मारना चाहता हूं और जो भी इसे स्ट्रिंग में मुद्रित करता हूं उसे डाल देना चाहता हूं। मैंने निम्नलिखित कोशिश की है:

pcap_process.terminate() 
result = pcap_process.stdout.read() # or readline(), etc. 

लेकिन (जब तक कि मैं कुछ गलत नहीं कर रहा), यह काम नहीं करता है; मैंने प्रक्रिया को मार दिया, अब पढ़ने के लिए कुछ भी नहीं बचा है। अगर मैं समाप्त होने से पहले read() या communicate() का उपयोग करता हूं, तो मेरी स्क्रिप्ट बस वहां बैठेगी और tcpdump को समाप्त करने के लिए प्रतीक्षा कर रही है (जो यह नहीं होगी)।

क्या ऐसा करने का कोई तरीका है (अधिमानतः बिना लूप के)?

+1

आप 'tcpdump' के मापदंडों में से प्रत्येक के लिए अलग से पारित करने के लिए की जरूरत है:' popen ([ 'tcpdump', '-s', '0', '-w', '-', 'tcp'], ...) '। एकल तर्क '-w -' को दो तर्क' -w' और '-', आदि के रूप में समझा नहीं जाता है। –

+0

सच है, यह सही उत्तर होगा :) धन्यवाद वैसे भी! –

उत्तर

8

टीसीपीडम्प का उपयोग करने के बजाय, अक्सर PCAP directly, या Scapy का उपयोग करने की सलाह दी जाती है।

यदि यह कोई विकल्प नहीं है, तो communicate पर terminate के बाद बस कॉल करें - प्रक्रिया को मारने से पाइप में डेटा नहीं निकलता है। हालांकि, मत भूलना उपप्रक्रिया के निर्माण में तर्क अलग करने के लिए ([,'-w', '-'][... , '-w -', ..] के बजाय):

pcap_process = subprocess.Popen(['tcpdump', '-s', '0', '-w', '-', 'tcp'], 
            stdout=subprocess.PIPE, stderr=subprocess.PIPE) 
+1

दुर्भाग्य से pypcap यहां कोई विकल्प नहीं है :(... यदि मैं ऐसा करता हूं, तो आउटपुट खाली होता है। शायद समस्या कहीं और है ... ಠ_ಠ –

+1

@sebastian_k ''-w -'' नाम की एक फ़ाइल में लिखता है - 'आप या तो' '-w-'' या' '-w' '' 'चाहते हैं। उत्तर अपडेट किया गया। – phihag

+0

आप बिल्कुल सही हैं, क्या मूर्खतापूर्ण गलती है। धन्यवाद एक गुच्छा, फिहाग! :) –