【问题标题】:Parse filename from Dumpcap output从 Dumpcap 输出解析文件名
【发布时间】:2015-07-14 19:27:13
【问题描述】:

我正在尝试从 linux 终端中运行 dumpcap 的输出中解析文件名,以便自动将其附加到电子邮件中。这是来自较大脚本的相关功能。 proc1stdouteventfile被初始化为""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 输出的事件文件,还是直接在脚本中执行?我在这里真的很茫然。我也不确定 dumpcap 如何存储它的输出。

dumcap在终端的输出是:

dumpcap.exe = dumpcap -a duration:300 -b duration:2147483647 -c 500 -i 1 -n -p -s 2 -w test -B 20
 -i 1 - f icmp and host 156.24.31.29 - c 2
/bin/sh: -i: command not found
Capturing on 'eth0'
File: test_00001_20150714141827
Packets captured: 500
Packets received/dropped on interface 'eth0': 500/0 (pcap:0/dumpcap:0/flushed:0/ps_ifdrop:0) (100.0%)
[Errno 2] No such file or directory: ''

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

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

【问题讨论】:

  • dumpcap.exe 命令的典型输出是什么?
  • @9 'dumpcap.exe = dumpcap -a 持续时间:300 -b 持续时间:2147483647 -c 500 -i 1 -n -p -s 2 -w 测试 -B 20 -i 1 - f icmp 和主机 156.24.31.29 - c 2 /bin/sh: -i: command not found 在“eth0”上捕获文件:test_00001_20150714141827 捕获的数据包:500 在接口“eth0”上接收/丢弃的数据包:500/0 (pcap:0/ dumpcap:0/flushed:0/ps_ifdrop:0) (100.0%) [Errno 2] 没有这样的文件或目录:''错误!邮递员出了点问题。请再试一次。'抱歉,我不知道如何正确编辑它,但要点是它输出了File: (filename)
  • @Googlesomething 请将其编辑到您的问题中(cmets 不保留格式)。
  • @Googlesomething 您在某些行中不知何故缺少右括号 - proc1 = subprocess.Popen(DUMPCAP, sparsedfile = line.split(':'。请仔细检查您在此处的代码,并确保它与您实际使用的代码相匹配。
  • @senshin 完成。我现在想知道是否不是以某种方式从输出中解析,而是更容易找到它保存到的目录并将最新文件附加到电子邮件功能。虽然我不确定如果由于达到最大文件大小而从 dumpcap 制作多个文件并且 dumpcap 创建一个新文件,这将如何工作

标签: python parsing rhel6


【解决方案1】:

看起来基本上你需要一个正则表达式。

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.

更新:读取管道标准输出的最小完整示例;希望这会有所帮助。

import subprocess
proc = subprocess.Popen("echo foo", shell=True, stdout=subprocess.PIPE)
result = proc.communicate()
print result[0]  # must be `foo\n`

【讨论】:

  • (stdout_contents) 由什么组成?
  • 就是你通过stdout = subprocess.PIPE捕获的终端中dumcap的输出,即proc2[0]
  • 这不起作用,因为'Popen object does not support indexing'... 或者这就是我在运行时遇到的错误
  • 啊,你似乎在这里重新分配了proc2proc2 = proc1.communicate()。请永远不要用不同类型的值重新分配变量(最好永远不要)。我们需要的是communicate() 的结果。阅读文档也有帮助。
  • 更改变量重新分配错误仍然在m=rx.search(proc1[0]) 线上给出了错误代码Popen object does not support indexes 是否有支持索引的Popen 替代方案?文档比人类更难理解
【解决方案2】:

Dumpcap 输出到它的标准错误,而不是标准输出。所以我设法将标准错误重定向到一个 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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-13
    • 1970-01-01
    • 1970-01-01
    • 2015-07-31
    • 1970-01-01
    相关资源
    最近更新 更多