如何解决计算.pcap文件中的唯一MAC地址
我正在尝试生成一个shell命令,该命令将使用tcpdump读取给定的.pcap文件,并在给定的.pcap文件中输出唯一MAC地址的数量
不能把我的头缠起来,加上“ tcp --help”是完全没有用的: 到目前为止,我已经知道了
tcpdump -r mypcap.pcap ether -v `dst ff:ff:ff:ff:ff:ff` | uniq -c
任何帮助将不胜感激
解决方法
Wireshark的TShark命令行实用程序可能会更好地工作,因为它可以更好地控制数据包的输出格式。
例如,您可以做
tshark -r mypcap.pcap -T fields -E separator=,-e eth.src -e eth.dst
对于以太网捕获,将为每个数据包打印数据包的源和目标MAC地址,并在它们之间使用逗号。
引用我机器上的uniq
手册页:
如果输入的重复行不相邻,则不会被检测到,因此可能有必要首先对文件进行排序。
因此您接下来应该将tshark
的输出通过管道传输到sort
。
但是,在那种情况下,sort
将进行排序,而uniq
将检查唯一性并用-c
进行计数,这是来源的对和目标地址。从06:05:04:03:02:01到01:02:03:04:05:06至06:05:04:03:02:01将被计为不同 02:03:04:05:06。这可能不是您想要的。
如果您想要计数源 MAC地址,而又不关心目标 MAC地址,请
tshark -r mypcap.pcap -T fields -e eth.src | sort | uniq -c
这可能是可能确定网络上存在哪些地址的最佳方法;您网络上的一台机器可能正在将数据包发送到网络上的目标地址 not (也许在地球上的任何地方都不存在或不是从地球发射的),因此目标地址可能不是您的目标地址想。另一方面,如果您的网络上有一台具有该目标地址的计算机,并且不必在网络上发送任何数据包,那么,如果您仅查看源地址,则不会显示该计算机。但是,即使不是不可能,也不太可能。 (例如,它不会响应ARP数据包,这使得网络上的其他计算机不太可能(尽管并非不可能)知道其MAC地址,因此也不太可能(尽管并非不可能)知道其MAC地址将会为目标地址。)
对于目标 MAC地址,请
tshark -r mypcap.pcap -T fields -e eth.dst | sort | uniq -c
如果两者都需要,则需要使用 newline 作为源地址和目标地址之间的分隔符,以将它们放在单独的行上,因此sort
将对源地址和目标地址进行排序目标地址和uniq
将找到唯一的地址。至少在使用兼容Bourne的shell(Bourne shell,Korn shell a / k / a ksh,Bourne-again shell a / k / a bash等)的情况下完成该操作,
tshark -r mypcap.pcap -T fields -E separator='
' -e eth.src -e eth.dst | sort | uniq -c
是的,在第一个引号之后是换行符,在换行符之后是另一个引号。
,如果只想计算捕获文件中存在的唯一以太网MAC地址的数量,那么我同意@ user13951124,对于这种用例,使用tshark
是更好的工具选择。在这里,我提出使用 tshark 的-z endpoints,eth
选项的替代解决方案。
例如,当我运行以下命令时,我有一个文件,其中包含2个唯一的以太网MAC地址:
tshark.exe -nqr mypcap.pcap -z endpoints,eth
我得到以下输出:
AST modules loaded
================================================================================
Ethernet Endpoints
Filter:<No Filter>
| Packets | | Bytes | | Tx Packets | | Tx Bytes | | Rx Packets | | Rx Bytes |
00:26:b9:b3:ce:7a 2 1072 2 1072 0 0
00:12:17:b5:0d:32 2 1072 0 0 2 1072
================================================================================
如果要计数,可以将输出传递到wc
,然后打印表达式的结果减去不相关的输出行数(在我的情况下为6),因此整个命令看起来像这个:
count=$(tshark.exe -nqr mypcap.pcap -z endpoints,eth | wc -l) && echo $(( $count - 6 ))
在这种情况下,您得到的输出很简单:
2
我的猜测是,此解决方案会更快,因为不需要排序,并且tshark
已经提供了唯一端点的列表,因此没有重复项可以处理。
我之前提出的解决方案是使用 tshark
- 我仍然建议使用该解决方案 - 但是如果您真的想使用 {{3 }} 来解决这个问题,那么它就可以完成,但您还需要其他实用程序的一些帮助。下面建议的解决方案需要 tcpdump
、cut
、sed
和 sort
。
最初的问题要求“...给定 .pcap 文件中唯一 MAC 地址的数量”,所以这正是下面的 count_unique_macs.sh strong> 脚本可以。它需要 .pcap 文件的 2 次传递,第一次隔离源 MAC,第二次隔离目标 MAC。它将它们全部写入一个临时文件,然后仅按唯一的 MAC 对它们进行排序。最后,它显示文件中的行数,然后删除临时文件。
#!/bin/sh
if [[ $# -lt 1 ]]; then
echo "Usage: count_unique_macs.sh <file>"
exit 1
fi
file=$1
tmp_file=/tmp/macs
tcpdump -r $file -ne 2> /dev/null | cut -d ' ' -f 2 > $tmp_file
tcpdump -r $file -ne 2> /dev/null | cut -d ' ' -f 4 | sed 's/,//' >> $tmp_file
cat $tmp_file | sort -u | wc -l
rm -f $tmp_file
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。