在python中处理tcpdump输出
我正在尝试用python处理tcpdump输出 我需要的是运行tcpdump(它捕获数据包并向我提供信息),读取输出并处理它 问题是tcpdump一直在运行,我需要在它输出后立即读取数据包信息并继续执行 我尝试研究python的子流程,并尝试使用popen调用tcpdump,并将stdout管道化,但它似乎不起作用 关于如何进行此操作的任何说明在python中处理tcpdump输出,python,subprocess,popen,tcpdump,Python,Subprocess,Popen,Tcpdump,我正在尝试用python处理tcpdump输出 我需要的是运行tcpdump(它捕获数据包并向我提供信息),读取输出并处理它 问题是tcpdump一直在运行,我需要在它输出后立即读取数据包信息并继续执行 我尝试研究python的子流程,并尝试使用popen调用tcpdump,并将stdout管道化,但它似乎不起作用 关于如何进行此操作的任何说明 import subprocess def redirect(): tcpdump = subprocess.Popen("sudo tcpd
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()
默认情况下,管道是块缓冲的,交互输出是行缓冲的。听起来您需要一个行缓冲管道-来自子流程中的tcpdump 在过去,我们推荐丹·伯恩斯坦的“pty”计划来解决这类问题。今天,pty似乎已经很久没有更新了,但是有一个新的程序叫做“emtpy”,它或多或少是相同的想法:
您可以尝试在子流程中的empty下运行tcpdump,使tcpdump行处于缓冲状态,即使它正在写入管道。您可以使用“-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
你能把代码发到现在吗?谢谢。您可以对iter中的行使用
(p.stdout.readline,b''):在Python2中打印行,因为p.stdout中的行使用,
在Python2上的输出中引入了不必要的延迟(OP希望:“一旦输出”)。如上所述,使用iter(…)
。请参阅stdlib中的python haspty
模块。或者可以使用pexpect
。还有一些stdbuf
,script
,unbuffer
实用程序可以强制执行行缓冲输出