我试图在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()
答案 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行缓冲,即使它正在写入管道。