我正在做一项作业,要求我根据给定的 pcap 文件回答某些问题。问题之一是找到前 5 个(根据发送的数据包数量)的源 IP 地址。
我想出了以下命令:
$ tshark -r assign1.pcap | sort -n -7 | tail -n 5 | awk '{print $3}'
在哪里
tshark -r
读取pcap文件assign.pcap
是抓包文件sort -n -7
根据第 7 列对文件进行排序(此列包含每个 IP 地址的包长度)tail -n 5
打印数据包长度最大的最后 5 条记录awk '{print $3}
仅打印第三列。
现在这是我的问题,因为我需要唯一的前 5 个源 IP 地址,所以我尝试uniq
在脚本末尾使用管道命令,但没有帮助。我也尝试使用sort -u -t, -k3,3
此关联但这也不会打印唯一的 IP 地址!
我的 pcap 文件列标题如下所示:
答案1
tshark
我认为如果你重新组织使用它的输出-T fields
会容易得多。我能够像这样完成你想要的事情:
$ tshark -r blah.pcap -T fields -e frame.len -e ip.src | sort -k 1n | tail -5
92 10.0.2.2
92 10.0.2.2
92 10.0.2.2
100 10.0.2.15
156 10.0.2.15
沙克菲尔德
您可以使用此命令获取所有字段的列表:
$ tshark -G field
但我发现读起来有点困难。如果您想了解输出中的列-G field
,请参阅此处:tshark - 转储和分析网络流量:
* Header Fields
* -------------
* Field 1 = 'F'
* Field 2 = descriptive field name
* Field 3 = field abbreviation
* Field 4 = type (textual representation of the ftenum type)
* Field 5 = parent protocol abbreviation
* Field 6 = base for display (for integer types); "parent bitfield width" for FT_BOOLEAN
* Field 7 = bitmask: format: hex: 0x....
* Field 8 = blurb describing field
如果你足够勇敢,你可以用它grep
来过滤输出:
$ tshark -G fields | grep -P '\s+(ip.src|frame.len)\s+'
F Frame length on the wire frame.len FT_UINT32 frame BASE_DEC 0x0
F Source ip.src FT_IPv4 ip 0x0
参考
答案2
所以在得到提示后这回答,我想出了这个脚本:
$ tshark -r assign1.pcap | sort -n -r -k7 | awk '!seen[$3]++' | awk '{print $3}' | head -n 5 >> result.txt
解释该行中的每个命令:
tshark -r assign1.pcap
读取pcap文件sort -n -r -k7
根据 (-k7) 第 7 列的 (-r) 逆序对文件进行数字排序 (-n) [此列包含每个 IP 地址的包长度]awk '!seen[$3]++'
打印以前没有见过的源 IP 地址(第 3 列),因此这种方式仅打印唯一的 IPawk '{print $3}'
只打印第三列(源IP地址)head -n 5 >> result.txt
因为我需要前 5 个,所以我使用头命令,最后>> result.txt
还将最终结果附加到文本文件。