2011-08-23 68 views
7

我在這樣的子運行tcpdump後:入門從tcpdump的標準輸出子進程終止它

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

-w -的說法是很重要的:它告訴tcpdump所得到的.pcap文件打印到stdout

然後我使用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

而不是使用tcpdump,通常建議使用​​或Scapy

如果這不是一個選項,只需在terminate之後調用communicate - 殺死一個進程不會中止管道中的數據。但是,不要忘了在創建子進程的分隔參數([,'-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

你絕對正確,多麼愚蠢的錯誤。 –

相關問題