2

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

一般来说,我想在 bash 中运行 tcpdump 时获取统计信息:

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

我尝试了以下格式的cmd:

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

proc.pid但是,杀死by后我没有得到统计数据proc.stdout/stderr.readline()
我也尝试使用:

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

他们都不能像我预期的那样输出统计数据。此外,我尝试了shell=True, 和shell=false- 相同的结果。

有没有办法我可以做到这一点?谢谢!

PS 我发现有一些与 tcpdump 相关的主题,不幸的是,据我所知,我没有发现他们可以帮助我解决这个问题。

4

1 回答 1

2

你是如何杀死进程的?

如果这是一个 UN*X,那么:

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

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

于 2013-02-17T19:20:32.350 回答