2011-08-23 49 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

你绝对正确,多么愚蠢的错误。 –

相关问题