终止后从tcpdump子进程获取stdout

时间:2011-08-23 15:53:29

标签: python subprocess 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 个答案:

答案 0 :(得分:8)

通常建议使用PCAP directlyScapy,而不是使用tcpdump。

如果这不是一个选项,只需在communicate之后调用terminate - 杀死一个进程不会杀死管道中的数据。但是,不要忘记在创建子流程([,'-w', '-']而不是[... , '-w -', ..])时分隔参数:

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