过滤tshark输出为.csv.防止丢失字段的错误



我试图用lua脚本过滤tshark中的pcap文件,并最终将其输出到。csv。我已经快到那里了,但我仍然遇到一些问题。

这是我到目前为止写的

tshark -nr   -V -X lua_script:wireshark_dissector.lua -r myfile.pcap -T fields -e frame.time_epoch -e Something_UDP.field1 -e Something_UDP.field2 -e Something_UDP.field3 -e Something_UDP.field4 -e Something_UDP.field5 -e Something_UDP.field6 -e Something_UDP.field15 -e Something_UDP.field16 -e Something_UDP.field18 -e Something_UDP.field22 -E separator=,

这是一个框架看起来像什么的例子。

frame 1
time: 1626806198.437893000
Something_UDP.field1: 0
Something_UDP.field2: 1
Something_UDP.field3:1
Something_UDP.field5:1
Something_UDP.field6:1
frame 2
time: 1626806198.439970000
Something_UDP.field8: 1
Something_UDP.field9: 0
Something_UDP.field13: 0
Something_UDP.field14: 0
frame 3
time: 1626806198.440052000
Something_UDP.field15: 1
Something_UDP.field16: 0
Something_UDP.field18: 1
Something_UDP.field19:1
Something_UDP.field20:1
Something_UDP.field22: 0
Something_UDP.field24: 0

我要找的输出应该是

1626806198.437893000,0,1,1,,1,1,1,,,,,
1626806198.440052000,,,,,,,,,1,0,,1,1,1,,0,0,,,,

也就是说,如果帧包含我正在寻找的字段之一,它将输出其值后跟一个逗号,但如果该字段不存在,它将输出一个逗号。一个问题是,并非每一帧都包含我感兴趣的信息,我不希望它们被输出。这个问题的部分原因是我需要的一个字段是epoch time,它会出现在每一帧中,但这只有在其他字段存在的情况下才重要。我可以使用awk或grep来做到这一点,但想知道它是否都可以在tshark中完成。另一个问题是,被请求的字段将来自一个文本文件,可能在文本文件中有字段,实际上不存在于pcap文件中,如果发生这种情况,我得到一个"tshark:一些字段无效:"错误。

总之,我有两个问题。

1:我只需要打印字段名称匹配的数据,但如果唯一匹配的是epoch,则不需要打印数据。

2:我需要它工作,即使被请求的字段之一不存在。

我只需要在字段名称匹配时打印数据,但如果唯一匹配的是epoch则不需要。

尝试使用一个显示过滤器,它会提到您感兴趣的所有字段名,并带有"或"将它们分开,例如s

-Y "Something_UDP.field1 or Something_UDP.field2 or Something_UDP.field3 or Something_UDP.field4 or Something_UDP.field5 or Something_UDP.field6 or Something_UDP.field15 or Something_UDP.field16 or Something_UDP.field18 or Something_UDP.field22"

使得只有包含这些字段中的至少一个的数据包才会被处理。

我需要它工作,即使被请求的字段之一不存在。

那么您将需要动态地构建命令行,避免无效的字段名。

在脚本中,测试字段是否有效的一种方法是使用dftest命令:

dftest Something_UDP.field1 >/dev/null 2>&1

如果有一个名为"Something_UDP.field1"的字段,将以0状态退出。如果没有,将退出状态为2;如果您正在使用的脚本语言可以检查命令的退出状态以查看它是否成功,则可以使用它。