- 文档
- 教程
【免费下载链接】linux-command
Linux命令大全搜索工具,内容包含Linux命令手册、详解、学习、搜集。https://git.io/linux
本篇指南基于 linux-command 仓库中的 ngrep 命令文档 展开,系统讲解 ngrep 的安装、语法、全部选项与真实抓包场景。读完你可以掌握:如何在 Linux 上从源码编译安装 ngrep,如何用类 grep 的正则表达式在实时流量中搜寻指定数据包,如何借助-W byline、-d、-t、-N等参数完成 HTTP 请求/响应、Flash 视频地址等实战抓取,并理解其与 libpcap、BPF 过滤器的关系。
什么是 ngrep:grep 的网络版
ngrep(network grep)是 grep 命令的网络版,它力求继承 grep 的多数特征,用于在实时网络流量中搜寻指定的数据包。简单来说,grep 在文本文件里做正则匹配,而 ngrep 在网卡上流过的数据包里做正则匹配。
ngrep 之所以能做到这一点,是因为它依赖libpcap库工作。libpcap 是 Linux 平台上最经典的抓包库,同样被 tcpdump 命令 所依赖。正因如此,ngrep 得以支持大量的操作系统和网络协议:它能识别TCP、UDP 和 ICMP包,并且理解BPF(Berkeley Packet Filter)过滤机制——这正是 tcpdump 抓包过滤表达式的底层引擎。
在本仓库中,ngrep 属于网络通讯类命令的范畴,与 tcpdump、netstat、ping、nc 等工具并列,是网络排障与安全分析中"按内容找包"的利器:tcpdump 擅长按主机、端口、协议过滤包,而 ngrep 更进一步,可以按包内的字符串内容(如 URL、关键字)匹配并展示整段报文。
安装 ngrep:libpcap 与源码编译
ngrep 的核心依赖是 libpcap,因此安装分两步:先装好 libpcap,再编译安装 ngrep 本体。
第一步:安装 libpcap
在 Red Hat 系发行版上,最简单的做法是直接用包管理器安装:
yum install libpcap需要注意:有时候用 libpcap 安装包装出来的库不完整,会直接影响 ngrep 的正常使用。如果 yum 无法安装,或安装后 ngrep 报错,建议采用源码编译方式安装 libpcap:
wget http://www.tcpdump.org/release/libpcap-1.3.0.tar.gz tar -zxf libpcap-1.3.0.tar.gz cd libpcap-1.3.0 ./configure make && make install第二步:编译安装 ngrep
ngrep 本身的安装就是经典的 configure / make / make install 三部曲:
./configure make make install常见问题:pcap 头文件路径
在 configure 阶段如果遇到please wipe out all unused pcap installations之类的报错,说明系统中存在多个 libpcap 安装,configure 无法判断使用哪一个。此时需要显式指定 pcap 头文件的安装路径,常见写法如下:
./configure --with-pcap-includes=/usr/local/include/pcap安装完成后,直接在终端输入ngrep即可验证安装是否成功——能正常输出网卡接口和启动信息,说明安装无误。
语法与命令行结构
ngrep 的完整语法如下:
ngrep <-LhNXViwqpevxlDtTRM> <-IO pcap_dump> <-n num> <-d dev> <-A num> <-s snaplen> <-S limitlen> <-w normal|byline|single|none> <-c cols> <-P char> <-F file> <match expression> <bpf filter>语法结构可以拆解为三个层次:
- 选项区:尖括号内是可选的命令行选项,控制显示格式、匹配行为、抓包数量等;
- match expression(匹配表达式):这是 ngrep 的核心,使用类 grep 的正则表达式去匹配数据包内容,例如
\.flv匹配包含.flv字符串的包; - bpf filter(BPF 过滤器):可选,使用 tcpdump 风格的过滤表达式,例如
tcp port 18080,只让符合条件的包进入匹配流程。
三者同时使用时,先由 BPF 过滤器做粗粒度筛选(按协议、端口、主机),再由正则匹配表达式做内容级筛选,最后按选项要求的格式输出。这与 grep 的"先选文件、再匹配内容"思路一脉相承。
选项速查表
ngrep 的选项分为几类,下面逐一说明:
匹配行为类
-e # 显示空数据包 -i # 忽略大小写 -v # 反转匹配(不匹配指定模式的数据包才会显示) -w # 整字匹配 -x # 以16进制格式显示 -X # 以16进制格式匹配 -N # 显示由 IANA 定义的子协议号 -M # 仅进行单行匹配其中-N在分析未知协议时非常有用:它会输出数据包所属的 IANA 子协议编号,便于判断应用层协议类型。
时间与输出格式类
-t # 在每个匹配的包之前显示时间戳 -T # 显示上一个匹配的数据包之间的时间间隔 -W # 设置显示格式,byline 将解析包中的换行符 -c # 强制显示列的宽度 -P # 设置不可打印字符的显示字符 -l # 使标准输出行缓冲(make stdout line buffered) -q # 静默输出(仅打印匹配到的包,不打印接口、match 等头信息)-W byline是最常用的可读性参数:默认情况下 ngrep 会把包内所有数据连续打印成一行,换行符也被当作普通字节,导致 HTTP 报文可读性极差;加上-W byline后,ngrep 会解析包内的换行符,把 HTTP 请求/响应的每一行(请求行、Header、空行)分行显示。
抓包控制类
-d # 使用哪个网卡,可以用 -L 选项查询 -L # 查询网卡接口 -p # 不使用混杂模式 -n # 仅捕获指定数目的数据包进行查看 -A # 匹配到数据包后 dump 随后的指定数目的数据包 -s # 设置 bpf 的 caplen(抓取长度) -S # 设置匹配包上的 limitlen(显示长度上限)-d any可以同时监听所有网卡;-A num类似 grep 的-A(after context),匹配到目标包后继续显示后续 num 个包,非常适合追踪一次请求引发的后续数据包。
文件读写与权限类
-I # 从文件中读取数据进行匹配 -O # 将匹配的数据保存到文件 -F # 使用文件中定义的 bpf(Berkeley Packet Filter) -D # 按 pcap_dump 文件记录的原始时间间隔回放数据包 -R # 不做权限降级逻辑(don't do privilege revocation logic)-I/-O让 ngrep 也能像 tcpdump 一样离线分析 pcap 文件:先用 tcpdump 或 ngrep-O抓包落盘,再用-I慢慢分析,避免线上长时间占用终端。-D则用于按原始时间间隔回放抓包文件,还原现场。
通配说明
上表中的-Lh组合里,-h用于显示帮助信息;其余选项的英文描述(如-R、-D、-s、-S、-P、-l)在帮助输出中即为原文,中文注释为补充解释。
实战一:捕捉指定端口的 HTTP 请求与响应
最常见的场景是在开发调试时,查看本机某个服务端口上进出站的 HTTP 报文。以监听本机18080端口为例:
ngrep -W byline -d lo port 18080-W byline:解析包中的换行符,否则包内所有数据都是连续的,可读性差;-d lo:监听本地回环网卡(loopback),本机进程间通信的流量都走 lo;port 18080:BPF 过滤器,只匹配 TCP/UDP 端口为 18080 的包。
如果要监听对外网卡上的 Web 流量(比如本机对外提供 80 端口服务),把网卡换成对外网卡即可:
ngrep -W byline -d eth0 port 80注意网卡名称在不同发行版/虚拟化环境可能不同(如eth0、ens33、enp0s3),可以先运行ngrep -L查看本机可用的网卡列表再指定。
如果不确定流量走哪张网卡,可以用-d any捕获所有网卡的包,再叠加过滤条件:
ngrep '[a-zA-Z]' -t -W byline -d any tcp port 18080这条命令同时演示了三个要素的组合用法:
'[a-zA-Z]':正则匹配表达式,只匹配包含字母的包,过滤掉纯二进制的噪声包;-t:在每个匹配的包前显示时间戳,便于观察请求时序;-d any+tcp port 18080:先按协议(TCP)和端口(18080)粗筛,再做内容匹配。
实战二:从实时流量中提取 Flash 视频下载地址
ngrep 一个非常经典的用途:在浏览网页时,从网络流量中实时抓取视频、图片等资源的真实下载 URL。
例如要捕获包含字符串.flv的数据包(Web Flash 视频文件的下载地址通常就藏在 GET 请求里),可以执行:
ngrep -d3 -N -q \.flv启动后 ngrep 会先打印当前使用的网卡接口和匹配表达式,例如:
interface: \Device\TNT_40_1_{670F6B50-0A13-4BAB-9D9E-994A833F5BA9} (10.132.0.0/255.255.192.0) match: \.flv这条命令用到了三个关键参数:
-d3:监听编号为 3 的网卡接口(不同平台编号规则不同,Windows 上会显示为\Device\TNT_40_1_...这样的 GUID 名称);-N:显示由 IANA 定义的子协议号,帮助识别应用层协议;-q:静默模式,只输出匹配到的数据包正文,不打印接口和 match 头信息,减少干扰。
此时打开一个视频播放页面,ngrep 会立刻捕获到携带.flv关键字的 HTTP GET 请求:
T(6) 10.132.34.23:24860 -> 61.142.208.154:80 [AP] GET /f59.c31.56.com/flvdownload/12/19/ggyg7741@56.com_56flv_zhajm_11955697397.flv HTTP/1.1..accept: */*..Referer: http://www.56.com/flashApp/v_player_site.swf..x-flash-version: 9,0,45,0..UA-CPU: x86..Accept-Encoding: gzip, deflate..User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30)..host: f59.r.56.com..Connection: Keep-Alive..Cookie: whistoryview=23423759-23635627-23423344-23171935-23058374-23081156-23207350-22395727-; geoip=............; wl_all_s=y....逐字段解读这段输出:
T(6):-t类时间戳信息,括号内数值与抓包时间处理相关;10.132.34.23:24860 -> 61.142.208.154:80:源地址端口到目的地址端口,说明这是本机发出的、发往对端 80 端口的请求;[AP]:TCP 标志位标记,A 表示 ACK、P 表示 PUSH,说明这是携带数据的确认包;GET /f59.c31.56.com/.../....flv HTTP/1.1:请求行,.flv文件的完整路径就在其中;- 后续的
accept、Referer、User-Agent、host、Cookie等是 HTTP 请求头,注意默认输出下它们之间以..分隔——这正是换行符未被解析的表现。
至此地址已经找到:http://f59.c31.56.com/flvdownload/12/19/ggyg7741@56.com_56flv_zhajm_11955697397.flv。
实战三:加 -W byline 提升可读性
默认输出把换行符显示为..,整段 Header 挤在一行里难以阅读。加上-W byline参数后,ngrep 会解析包内的换行符,输出变成按行展示的标准 HTTP 报文:
T(6) 2007/11/25 15:56:12.192619 10.132.34.23:26365 -> 59.151.21.101:80 [AP] GET /aa.flv HTTP/1.1. Accept: */*. Accept-Language: zh-cn. UA-CPU: x86. Accept-Encoding: gzip, deflate. User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30). Host: www.google.cn. Connection: Keep-Alive. Cookie: PREF=id=a0b2932c336477e9:TB=4:NW=1:TM=1187877372:LM=1187956074:S=Y1FzndprT3vFo7ac; SID=DQAAAHcAAABJCEXeOVLHu2rIfb5BfKP3GG9PbhJDEkXsLTV8y0f_lvSd2Y46Q0FPt83CnEs9rxA1xBDM9mLR8-ckWeScyOQA8PyYnX5u5OjFvjfRbDg_FDZfwxhRzqS9KPZv26pjnsUxs0FDM1xpJ5AgDn38pXtlCdkksJ0-cbiIWoA61oHWMg; NID=7=AvJxn5B6YOLLxoYz4LLzhIbNsQUQiulRS6UJGxdBniQBmXm99y7L-NBNORN82N3unmZSGHFPfePVHnLK2MjYjglyXZhU9x7ETXNBnY3NurNijHDhJ7Kyi7E53UBOcv4V.对比默认输出可以看到:
- 行首时间戳升级为完整格式:
2007/11/25 15:56:12.192619,精确到微秒; - 每个 Header 独占一行,句尾的
.即原包中的\r\n换行符解析结果; - 请求行、各请求头、Cookie 一目了然,适合直接阅读和复制分析。
与 grep、tcpdump 的配合与区别
- grep:处理的是文本文件/命令输出,在 linux-command 仓库中对应 grep 命令文档。它支持
-i(忽略大小写)、-v(反转)、-w(整词)、-A/-B/-C(上下文行)等;ngrep 借鉴了其中大部分语义(-i、-v、-w、-A),但作用对象从"行"变成了"网络数据包"。 - tcpdump:处理的是网络数据包,对应仓库中的 tcpdump 命令文档,按主机、端口、协议等 BPF 表达式过滤,输出包头信息;ngrep 同样内置 BPF 过滤器(
port 18080、tcp port 18080写法一致),但额外提供包内容正则匹配和可读的报文正文展示(-W byline),适合直接在流量里找关键字、看请求内容。
实际排障时可以组合使用:先用 tcpdump 确认流量存在与包方向,再用 ngrep 匹配具体内容;或先用 tcpdump-w落盘抓包,再用 ngrep-I离线分析,互不冲突。
常见问题与注意事项
- 权限问题:抓包通常需要 root 权限,若提示网卡无法打开,请用
sudo或 root 用户执行;-R选项用于控制是否执行权限降级逻辑。 - 网卡选择:不确定用哪张网卡时,先
ngrep -L列出所有接口;本机通信用-d lo,对外流量用-d eth0或-d any。 - 正则转义:匹配点号等特殊字符时要转义,如
\.flv;在 shell 中最好用单引号包裹表达式,防止[a-zA-Z]这类字符被 shell 展开。 - 可读性:观察 HTTP 这类按行组织的文本协议时,务必加
-W byline,否则包内数据会连成一行。 - 依赖完整性:libpcap 安装不完整是 ngrep 无法正常工作的常见原因,遇到 configure 报
please wipe out all unused pcap installations时,按上文用--with-pcap-includes指定头文件路径重新 configure 即可。 - 离线分析:需要长时间抓包时,用
-O将匹配数据保存为 pcap 文件,之后再通过-I读取分析,或配合-D按原始时间间隔回放。
延伸阅读
- 本文原始出处为仓库中的 command/ngrep.md,可在 linux-command 仓库(通过 npm 安装
linux-command包 或直接浏览 command 目录)中查阅。 - 相关工具文档:tcpdump 抓包命令、grep 文本搜索命令、netstat 网络状态命令、nc 网络工具。
- 仓库还提供了完整的 命令贡献规范,如需补充 ngrep 更多实例,可参照其中的文档格式约定提交。
- 文档
- 教程
【免费下载链接】linux-command
Linux命令大全搜索工具,内容包含Linux命令手册、详解、学习、搜集。https://git.io/linux
相关推荐
Cherry Studio 跨平台上手指南:Windows、macOS、Linux 各 3 步装好,多模型一个入口管起来
Cherry Studio 跨平台上手指南:Windows、macOS、Linux 各 3 步装好,多模型一个入口管起来 在 Windows 台式机、Mac 笔
AI 应用大模型桌面应用本地部署RAGProxyPin:全平台网络抓包工具实战指南
ProxyPin:全平台网络抓包工具实战指南 ProxyPin是一款基于Flutter框架开发的开源免费抓包工具,支持Windows、Mac、Linux、And
网络开发工具接口测试Linux 命令大全之 grep:文本搜索与正则匹配实战手册(linux-command 项目)
Linux 命令大全之 grep:文本搜索与正则匹配实战手册(linux command 项目) 本文是 linux command 项目 command/gr
文档教程
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考