从Dumpcap outpu解析文件名

2024-09-23 22:28:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图解析linux终端运行dumpcap输出的文件名,以便自动将其附加到电子邮件中。这是一个较大的脚本中的相关函数。proc1stdout和{}初始化为""DUMPCAP是命令行字符串dumpcap -a duration:300 -b duration:2147483647 -c 500 -i 1 -n -p -s 2 -w test -B 20

def startdump():                       
    global DUMPCAP                     
    global dumpdirectory               
    global proc1                       
    global stdout                      
    global eventfile                   
    setDumpcapOptions()                
    print("dumpcap.exe = " + DUMPCAP)  
    os.chdir(dumpdirectory)            
    #subprocess.CREATE_NEW_CONSOLE     
    proc1 = subprocess.Popen(DUMPCAP, shell=True, stdout=subprocess.PIPE)
    for line in proc1:                 
        if 'File: ' in line:           
            parsedfile = line.split(':')
            eventfile = parsedfile[1]  
    if dc_mode == "Dumpcap Only":      
        proc1.communicate()            
        mail_man(config_file)          
     return proc1                       

def startevent():
    global EVENT
    global proc1
    global eventfile
    setEventOptions()
    print(EVENT)
    # subprocess.CREATE_NEW_CONSOLE
    proc2 = subprocess.Popen(EVENT, shell=True, stdout=subprocess.PIPE) 
    if dc_mode == "Dumpcap+Event" or dc_mode == "Trigger" or dc_mode == "Event Only":
        proc2 = proc1.communicate()
        mail_man(config_file)
    return proc2

我一直存在的问题是,我不知道如何从dumpcap的输出中解析文件名。不管我做什么,它都会从输出中解析""。我很抱歉,如果这似乎是没有听到。我已经开始自学python和linux一个月了,文档在网上简洁易懂。在

我应该创建一个函数来解析dumpcap输出中的eventfile,还是直接在脚本中执行?我真的不知所措。我也不确定dumpcap是如何存储其输出的。在

终端中dumcap的输出为:

^{pr2}$

File: ...包含由dumpcap保存的pcap文件的随机生成的名称。我正试图从终端解析该行,以获取File:设置为变量后的所有内容,但常规方法split似乎不起作用

它给出的另一个错误是Popen不能被索引


Tags: event终端ifmodestdoutlinedcglobal
2条回答

Dumpcap输出到它的stderr,而不是stdout。所以我设法将stderr重定向到一个txt文件,然后我可以解析它。在

def startdump():
    global DUMPCAP, dumpdirectory, proc1
    global eventfile, dc_capfile

    DUMPCAP = ''
    print("========================[ MAIN DUMPCAP MONITORING ]===========================")
    setDumpcapOptions()
    os.chdir(dumpdirectory)
    if platform == "Linux":
        DUMPCAP = "dumpcap " + DUMPCAP
    elif platform == "Windows":
        DUMPCAP = "dumpcap.exe " + DUMPCAP
    proc1 = subprocess.Popen(DUMPCAP, shell=True, stderr=subprocess.PIPE)
    #procPID = proc1.pid
    if dc_mode == "Dumpcap Only":
        time.sleep(5)
        with open("proc1stderr.txt", 'w+') as proc1stderr:
            proc1stderr.write(str(proc1.stderr))
            for line in proc1.stderr:
                print("%s" % line)
                if "File:" in line:
                    print(line)
                    raweventfile = line.split('File: ')[1]
                    eventfile = raweventfile.strip('\[]').rstrip('\n')
                    mail_man()
            proc1.communicate()

看起来基本上你需要一个regexp。在

import re
rx = re.compile('^File: (\S+)$', re.MULTILINE)
m = rx.search(stdout_contents)
if m:
  file_name = m.group(1)
# else: file name not detected.

更新:一个读取管道stdout的最小完整示例;希望这有帮助。在

^{pr2}$

相关问题 更多 >