14

我试图在 python 中处理 tcpdump 输出。

我需要的是运行 tcpdump(它捕获数据包并为我提供信息)并读取输出并处理它。

问题是 tcpdump 一直在运行,我需要在它输出后立即读取数据包信息并继续执行它。

我尝试查看 python 的子进程并尝试使用 popen 调用 tcpdump 并通过管道传输标准输出,但它似乎不起作用。

有关如何进行此操作的任何指示。

import subprocess

def redirect():
    tcpdump = subprocess.Popen("sudo tcpdump...", stdin=subprocess.PIPE, stdout=subprocess.PIPE, shell=True)
    while True:
        s = tcpdump.stdout.readline()
        # do domething with s

redirect()
4

2 回答 2

20

您可以使用“-l”使 tcpdump 行缓冲。然后,您可以使用 subprocess 来捕获输出。

import subprocess as sub

p = sub.Popen(('sudo', 'tcpdump', '-l'), stdout=sub.PIPE)
for row in iter(p.stdout.readline, b''):
    print row.rstrip()   # process here
于 2013-07-28T02:44:02.770 回答
2

默认情况下,管道是块缓冲的,交互式输出是行缓冲的。听起来您需要一个行缓冲管道 - 来自子进程中的 tcpdump。

在过去,我们会推荐 Dan Bernstein 的“pty”程序来处理这类事情。今天好像pty好久没更新了,不过有一个新程序叫“emtpy”,思路差不多: http ://empty.sourceforge.net/

您可以尝试在子进程中在空的情况下运行 tcpdump 以使 tcpdump 行缓冲,即使它正在写入管道。

于 2013-07-28T02:35:31.207 回答