终止后从tcpdump子进程获取包统计信息

时间:2013-02-17 11:00:37

标签: python subprocess tcpdump

我正在使用subprocess.Popen来执行tcpdump,它可以在我的代码中正确收集包信息。
之后,我想使用os.kill(pid, signal.SIGKILL)通过另一个线程杀死tcpdump,然后记录相关的数据包统计信息。

一般情况下,我想在bash中运行tcpdump时获取统计信息:

  • 捕获的数据包
  • 过滤器收到的数据包
  • 内核丢弃的数据包

我按以下格式尝试了cmd:

proc=subprocess.Popen(shlex.split(tcpdump_cmd), 
                      stdouot=subprocess.PIPE, 
                      stderr=subprocess.PIPE)

然而,在proc.pid杀死proc.stdout/stderr.readline()之后,我未能获得统计数据 我也尝试过使用:

fcntl.fcntl(fd.fileno().fcntl.F_SETFL,
            (fcntl.fcntl(fd.fileno.F_GETFL) | os.O_NDELAY | os.O_NONBLOCK))

他们都不能按我的预期输出统计数据。 另外,我尝试了shell=Trueshell=false - 结果相同。

有没有办法实现这一目标? 谢谢!

P.S。我发现有一些与tcpdump相关的主题,不幸的是,据我所知,我没有发现他们可以在这个问题上帮助我。

1 个答案:

答案 0 :(得分:2)

你是如何杀死这个过程的?

如果这是UN * X,那么:

  • 如果你用SIGKILL杀死它,那将立即终止tcpdump并且没有机会打印统计数据,所以没有统计数据可读;
  • 如果你用SIGTERM或SIGINT杀死它,它会向它发送一个它捕获的信号,所以它会在终止之前打印统计信息。

如果这是Windows(因此您正在使用WinDump),您可能无法终止它,从而使其有机会打印统计信息。