Python tshark提取字段及其字符串表示形式
我有一个tshark的pcap文件,其中包含我要分析的数据。我想分析它并导出到CSV或xls文件。在中,我可以看到我可以使用带有正确参数的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.
-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中,并将值映射到那里。嗯,这可能是一个解决方案,我要试试这个,我其实早就想到了。谢谢你固化了我的直觉