我在这样的子流程中运行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
完成(它不会)。
有没有办法做到这一点(最好没有循环)?
答案 0 :(得分:8)
通常建议使用PCAP directly或Scapy,而不是使用tcpdump。
如果这不是一个选项,只需在communicate
之后调用terminate
- 杀死一个进程不会杀死管道中的数据。但是,不要忘记在创建子流程([,'-w', '-']
而不是[... , '-w -', ..]
)时分隔参数:
pcap_process = subprocess.Popen(['tcpdump', '-s', '0', '-w', '-', 'tcp'],
stdout=subprocess.PIPE, stderr=subprocess.PIPE)