终止后从tcpdump子进程获取stdout

seb*_*n_k 7 python subprocess tcpdump

tcpdump在这样的子进程中运行:

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

-w -参数是很重要的:它告诉tcpdump给打印结果.pcap文件stdout.

然后我继续使用访问网站urllib.open().完成此操作后,我想杀死tcpdump并将其打印的任何内容放入字符串中.我尝试过以下方法:

pcap_process.terminate()
result = pcap_process.stdout.read()    # or readline(), etc.
Run Code Online (Sandbox Code Playgroud)

但是(除非我做错了),这不起作用; 我杀了这个过程,现在没什么可读的.如果我使用read()communicate()在终止之前,我的脚本将只是坐在那里继续阅读,等待tcpdump完成(它不会).

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

phi*_*hag 8

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

如果这不是一个选项,只需拨打communicateterminate-杀的过程不会在管道它杀死的数据.但是,不要忘记在创建子进程([,'-w', '-']而不是[... , '-w -', ..])时分隔参数:

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