Python tshark提取字段及其字符串表示形式

Python tshark提取字段及其字符串表示形式,python,wireshark,tshark,Python,Wireshark,Tshark,我有一个tshark的pcap文件,其中包含我要分析的数据。我想分析它并导出到CSV或xls文件。在中,我可以看到我可以使用带有正确参数的-z选项,或者将-T与-E和-E一起使用。我正在Debian机器上使用python 3.6。当前,我的命令如下所示: command="tshark -q -o tcp.relative_sequence_numbers:false -o tcp.analyze_sequence_numbers:false " \ "-o tcp.

我有一个tshark的pcap文件,其中包含我要分析的数据。我想分析它并导出到CSV或xls文件。在中,我可以看到我可以使用带有正确参数的
-z
选项,或者将
-T
-E
-E
一起使用。我正在Debian机器上使用python 3.6。当前,我的命令如下所示:

command="tshark -q -o tcp.relative_sequence_numbers:false -o tcp.analyze_sequence_numbers:false " \
              "-o tcp.track_bytes_in_flight:false -Q -l -z diameter,avp,272,Session-Id,Origin-Host," \
              "Origin-Realm,Destination-Realm,Auth-Application-Id,Service-Context-Id,CC-Request-Type,CC-Request-Number," \
              "Subscription-Id,CC-Session-Failover,Destination-Host,User-Name,Origin-State-Id," \
              "Multiple-Services-Credit-Control,Requested-Service-Unit,Used-Service-Unit,SN-Total-Used-Service-Unit," \
              "SN-Remaining-Service-Unit,Service-Identifier,Rating-Group,User-Equipment-Info,Service-Information," \
              "Route-Record,Credit-Control-Failure-Handling -r {}".format(args.input_file)
稍后,我将使用熊猫数据帧处理它,如下所示:

# loops adding TCP and/or UDP ports to scan traffic from
    if args.tcp:
        for port in args.tcp:
            command += " -d tcp.port=={},diameter".format(port)

    if args.udp:
        for port in args.udp:
            command += " -d udp.port=={},diameter".format(port)

    # calling subprocess with output redirection to task variable
    task = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE)

    # a loop adding new data dictionaries to data_list
    for line in task.stdout:
        line = re.sub(r"'", "", line.decode("utf-8")) # firstly, decode byte string and get rid of '
        # secondly, split string every whitespace or = and obtain dictionary-like list of keys, values
        line = re.split(r"\s|=", line)

        # convert obtained list to ordered dictionary to preserve column order
        # transform list to dictionary so that each i item is dictionary key and i+1 item is it's value
        dict = OrderedDict(line[i:i+2] for i in range(0, len(line)-2, 2))
        data_list.append(dict)

    # remove last 4 dictionaries (last 4 lines of task.stdout)
    data_list = data_list[:-4]
    df = pd.DataFrame(data_list).fillna("-") # create data frame from list of dicts and fill each NaN with "-"
    df.to_excel("{}.xls".format(args.output_file), index=False)
    print("Please remember that 'frame' column may not correspond to row index!")
当我打开输出文件时,我可以看到它工作正常,除了在例如
CC Request Number
中我有数值而不是字符串表示,即在Wireshark中,我有如下数据:

command="tshark -q -o tcp.relative_sequence_numbers:false -o tcp.analyze_sequence_numbers:false " \
              "-o tcp.track_bytes_in_flight:false -Q -l -z diameter,avp,272,Session-Id,Origin-Host," \
              "Origin-Realm,Destination-Realm,Auth-Application-Id,Service-Context-Id,CC-Request-Type,CC-Request-Number," \
              "Subscription-Id,CC-Session-Failover,Destination-Host,User-Name,Origin-State-Id," \
              "Multiple-Services-Credit-Control,Requested-Service-Unit,Used-Service-Unit,SN-Total-Used-Service-Unit," \
              "SN-Remaining-Service-Unit,Service-Identifier,Rating-Group,User-Equipment-Info,Service-Information," \
              "Route-Record,Credit-Control-Failure-Handling -r {}".format(args.input_file)

CC Request Number
列的输出excel文件中,我可以在与此数据包对应的行中看到
3
,而不是
TERMINATION-Request


我的问题是:在使用
-z
选项时,如何将这个数字转换为其字符串表示形式,或者(正如我在网上看到的那样)如何使用
-T
-e
命令获取上面提到的字段及其值?我用
tshark-G
列出了所有可用的字段,但是它们太多了,我想不出任何合理的方法来找到我想要的字段。

奇怪的是,对于
-t字段和
-e
,tshark总是打印数字表示,但是使用“自定义字段”输出格式,它打印文本表示。好消息是,自定义字段模式实际上比
-T字段
模式快3倍。坏消息是,据我所知,没有办法控制自定义字段之间的分隔字符,因此如果字段内容可能包含空格,则它似乎不可用

请尝试以下操作,而不是
-z

-o column.format:'"time", "%t", "type", "%Cus:diameter.CC-Request-Number"'

奇怪的是,对于
-T字段
-e
,tshark总是打印数字表示,但对于“自定义字段”输出格式,它打印文本表示。好消息是,自定义字段模式实际上比
-T字段
模式快3倍。坏消息是,据我所知,没有办法控制自定义字段之间的分隔字符,因此如果字段内容可能包含空格,则它似乎不可用

请尝试以下操作,而不是
-z

-o column.format:'"time", "%t", "type", "%Cus:diameter.CC-Request-Number"'

感谢John Zwick的建议,以及下面介绍的关于我实现的代码的Python文档(我从官方Wireshark Github存储库下载):


感谢John Zwick的建议,以及下面介绍的关于我实现的代码的Python文档(我从官方Wireshark Github存储库下载):


我是否应该将
-o
应用于我希望使用字符串表示的每一列?此外,
-z
是用于统计的,我可以看到,
-o
只是覆盖了默认值,所以为什么我实际上应该使用
-o
而不是
-z
?@Colonder:试试看什么对你有用。您的案例有点特殊,因为
-z diameter
可能会做一些不容易复制的事情。你可以尝试混合我的答案,同时仍然使用
-z diameter
——我不知道它会做什么。实验,我会的。也许你知道任何一种字典都有那些键值对,我可以在其中搜索一个合适的数字键?@Colonder:当然,就是这里:-也许一个解决方案就是将这个文件加载到Pandas中,并将值映射到那里。嗯,这可能是一个解决方案,我要试试这个,我其实早就想到了。谢谢你巩固了我的直觉,我应该把
-o
应用到我想用字符串表示的每一列吗?此外,
-z
是用于统计的,我可以看到,
-o
只是覆盖了默认值,所以为什么我实际上应该使用
-o
而不是
-z
?@Colonder:试试看什么对你有用。您的案例有点特殊,因为
-z diameter
可能会做一些不容易复制的事情。你可以尝试混合我的答案,同时仍然使用
-z diameter
——我不知道它会做什么。实验,我会的。也许你知道任何一种字典都有那些键值对,我可以在其中搜索一个合适的数字键?@Colonder:当然,就是这里:-也许一个解决方案就是将这个文件加载到Pandas中,并将值映射到那里。嗯,这可能是一个解决方案,我要试试这个,我其实早就想到了。谢谢你固化了我的直觉