Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中处理tcpdump输出_Python_Subprocess_Popen_Tcpdump - Fatal编程技术网

在python中处理tcpdump输出

在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

我正在尝试用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()

默认情况下,管道是块缓冲的,交互输出是行缓冲的。听起来您需要一个行缓冲管道-来自子流程中的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 has
pty
模块。或者可以使用
pexpect
。还有一些
stdbuf
script
unbuffer
实用程序可以强制执行行缓冲输出