7

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()orcommunicate()在终止之前,我的脚本只会坐在那里继续阅读,等待tcpdump完成(它不会)。

有没有办法做到这一点(最好没有循环)?

4

1 回答 1

8

通常建议直接使用 PCAPScapy,而不是使用 tcpdump 。

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

pcap_process = subprocess.Popen(['tcpdump', '-s', '0', '-w', '-', 'tcp'],
                                  stdout=subprocess.PIPE, stderr=subprocess.PIPE)
于 2011-08-23T16:00:05.077 回答