本文来自依云's Blog,转载请注明。
(失眠了,干脆起来写文。)
调试时经常会有抓包的需求。通常,我在本地用图形界面的 Wireshark 来抓包及解析,而对于远程服务器,因为没有图形界面,只好使用 tcpdump 抓包到文件然后复制到本地拿 Wireshark 看了,这样就不能实时查看抓到的包了。当然 tcpdump 也可以实时输出,但是信息太少、难以阅读,功能也过于简单,比如我要跟踪流啊、不同的流用不同的颜色高亮啊、添加注释啊、时序分析啊,tcpdump 完全没办法做到。实际上复杂一点的协议解析它都做不到。
一直没去研究 Wireshark 如何从标准输入读取网络包数据。大概是某天下意识地按了一下Alt-h看到了 Wireshaark 的 man 手册,才知道原来 Wireshark 支持这么多参数!图形界面的程序支持各种可选参数的可不多见。Wireshark 指定-i -
就可以从标准输入读取数据,不过要同时指定-k
,不然得在图形界面里点「Start」开始抓包。
那怎么把抓到的数据包发送到标准输出呢?实际的抓包操作不是 Wireshark 直接执行的。Wireshark 又不是 360,既然能以普通用户身份执行需要特权的操作,那么就会有一个无图形界面的工具来辅助。它就是 dumpcap。查阅其 man 手册可知,把抓到的数据输出到标准输出的选项是-w - -P
(-P
指定使用 pcap 格式,不然会使用 pcap-ng 格式,Wireshark 不认)。还可以给定其它选项,比如只抓 lo 网络设备上的包用-i lo
,或者指定一个过滤器如-f 'port 1234'
(具体语法见pcap-filter
的 man 手册)。一定要记住不要把传输抓包数据的数据包也抓到了哦~
比如:
ssh lxc-debian sudo dumpcap -P -w - -f "'not port 22'" | \ wireshark -i - -k
这样就可以实时看到远程主机上的网络包了~通过 ssh 执行命令时引号得用双层的。使用 sudo 是因为我那个 Debian 的 dumpcap 没有特权。
Jun 01, 2015 09:36:40 AM
赞,这个很实用啊
Jun 04, 2015 10:40:34 AM
直接用tcpdump也可以
ssh bran@hodor "tcpdump -i eth0 -s 0 -U -w - not port 22" | wireshark -k -i -
Jun 05, 2015 02:06:40 AM
其实直接用tshark就可以,是wireshark自带的命令行工具,也是很强大的。
Jun 05, 2015 08:08:35 AM
哦哦,好棒~
Jun 05, 2015 09:47:02 PM
试过了,tcpdump 不仅比 dumpcap 易于取得,而且它会在 wireshark 关闭时自动退出~好棒~~
Sep 13, 2020 11:52:57 AM
termshark可以考虑一下