在python中处理tcpdump输出

时间:2013-07-28 01:48:55

标签: python subprocess popen tcpdump

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

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

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

我试着查看python的子进程并尝试使用popen调用tcpdump并管道stdout但它似乎没有用。

有关如何进行此操作的任何说明。

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()

2 个答案:

答案 0 :(得分:18)

您可以使用“-l”使tcpdump行缓冲。然后你可以使用子进程来捕获输出结果。

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

答案 1 :(得分:2)

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

在过去,我们推荐Dan Bernstein的“pty”计划用于此类事情。今天看来pty还没有在很长一段时间内更新,但是有一个名为“emtpy”的新程序或多或少是相同的想法: http://empty.sourceforge.net/

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