tshark是Wireshark项目自带的命令行抓包工具,它把Wireshark的核心解析引擎搬到了终端里。在Ubuntu服务器或者远程SSH环境中,没有图形界面可用,此时tshark几乎成了数据包分析的唯一选择。它不仅支持实时抓包,还能离线分析pcap文件,配合过滤器和统计功能,排查网络问题的效率并不比图形界面低。本文将从安装、基础抓包、过滤语法到几个典型实战场景,完整梳理tshark的用法。

一、安装tshark与基础环境配置
在Ubuntu上安装tshark非常简单,它包含在wireshark-common软件包体系中,直接通过apt安装即可:
sudo apt update sudo apt install tshark -y tshark -v
安装过程中系统会询问是否允许非超级用户抓包,选择“是”会自动创建wireshark用户组。如果当时跳过了,也可以手动把当前用户加入wireshark组,避免每次抓包都要加sudo:
sudo usermod -aG wireshark $USER # 重新登录后生效,验证抓包权限 tshark -c 1
加入用户组后需要注销重新登录才能生效。如果不想改权限,也可以一直使用sudo tshark执行,但要注意输出重定向时文件属主会变成root,后续读取时可能需要sudo chown调整属主。
安装完成后建议先熟悉几个基础参数:-i指定网卡,-c限制抓包数量,-w写入pcap文件,-r读取pcap文件。例如tshark -i eth0 -c 100 -w /tmp/test.pcap表示在eth0网卡上抓100个包并保存到文件。用tshark -D可以列出系统上所有可用的抓包接口,包括蓝牙、VPN虚拟网卡等,确认网卡名称时很常用。
二、捕获过滤器与显示过滤器的区别
tshark有两套完全不同的过滤语法,初学者最容易在这里混淆。捕获过滤器用在-f参数后面,遵循BPF语法,在抓包阶段生效,内核只把匹配的数据包交给tshark,性能开销小,但语法能力有限。显示过滤器用在-Y参数后面,是Wireshark的专有语法,在抓包完成后对已解析的字段做筛选,表达能力强大得多。
BPF语法的典型写法如下:
# 只抓指定主机的流量 sudo tshark -i eth0 -f "host 192.168.1.100" # 只抓80端口的TCP流量 sudo tshark -i eth0 -f "tcp port 80" # 排除SSH自身的流量,避免抓包时被自己的会话刷屏 sudo tshark -i eth0 -f "not port 22"
显示过滤器则基于协议字段名,字段名可以通过tshark -G fields查看完整列表,或者直接参考Wireshark官方文档。常见写法包括:
# 筛选HTTP状态码为500的响应 tshark -r capture.pcap -Y "http.response.code == 500" # 筛选指定IP且指定端口的所有包 tshark -r capture.pcap -Y "ip.addr == 192.168.1.100 && tcp.port == 443" # 筛选DNS查询中包含某域名的包 tshark -r capture.pcap -Y "dns.qry.name contains \"example\""
实际工作中推荐组合使用:先用捕获过滤器缩小抓包范围,减少磁盘占用,抓完后再用显示过滤器做精细分析。比如排查一台Web服务器的慢请求,可以先用-f "tcp port 80 or tcp port 443"只抓Web流量,保存文件后再用-Y逐层筛选。
三、实战场景:提取HTTP请求与跟踪TCP流
tshark最实用的能力之一是字段提取。通过-T fields配合-e参数,可以把感兴趣的字段直接输出成表格,非常适合做日志分析和自动化处理。比如提取一段时间内所有HTTP请求的源IP、目标主机、请求路径和状态码:
tshark -i eth0 -Y "http.request" \ -T fields -e frame.time \ -e ip.src \ -e http.host \ -e http.request.uri \ -e http.user_agent \ -E separator=, -E quote=d
其中-E separator=,指定逗号分隔,-E quote=d给字段加双引号,输出结果可以直接导入Excel或者交给awk、grep做二次处理。这在排查异常爬虫、统计接口调用频率时非常高效,比人工翻图形界面快得多。
另一个高频场景是跟踪TCP流。当你定位到一个可疑报文后,往往需要还原整条会话的内容,-z参数提供了丰富的统计和跟踪功能:
# 跟踪第一条TCP流的ASCII内容 tshark -r capture.pcap -q -z follow,tcp,ascii,0 # 统计各协议数据包分布 tshark -r capture.pcap -q -z io,phs # 按会话统计流量,快速找出流量最大的连接 tshark -r capture.pcap -q -z conv,tcp
-z conv,tcp输出的会话统计表在实际排查中特别有用,按字节数排序后,一眼就能看到哪条连接消耗了最多带宽,再结合-z follow查看具体内容,基本可以判断是正常业务高峰还是异常外发流量。
四、定时抓包与生产环境注意事项
生产环境中经常需要长时间监控,直接无限制抓包会迅速耗尽磁盘空间。tshark提供了多个缓冲控制参数:-a filesize:51200表示单个文件达到50MB后自动停止,-b files:10 -b filesize:20480则是环形缓冲模式,保留最近10个20MB的文件,旧文件自动被覆盖,配合cron定时任务可以构建轻量的持续监控方案。
# 环形缓冲抓包,最多保留10个文件,每个20MB sudo tshark -i eth0 -f "tcp port 80" \ -b files:10 -b filesize:20480 \ -w /var/capture/web.pcap
还有几点经验值得注意。第一,远程SSH排查时务必排除22端口,否则终端输出会被自己的SSH流量淹没;第二,高流量环境下优先使用捕获过滤器而不是显示过滤器,显示过滤器仍然会解析所有到达的包,CPU占用差异明显;第三,写文件抓包时不要同时加-V参数输出详细解析,两者同时开启会拖慢速度,需要看解析内容时再离线读取。
掌握tshark之后,你会发现命令行下的抓包分析反而更灵活:命令可以写进脚本、结果可以管道处理、远程服务器无需桌面环境。把它和BPF捕获过滤器、显示过滤器以及-T fields字段提取组合起来,基本能覆盖日常网络排障的绝大多数需求。