lsof 是什么
lsof 的本职工作是列出进程打开的文件,而 Linux 上套接字也是一种文件,所以它天然具备双向查询能力:既可以从进程出发看它开了哪些网络连接,也可以从端口或对端地址出发反查到持有它的进程。它的数据来源是 /proc/<PID>/fd 与 /proc/net/ 下的内核表。相比 ss 侧重连接状态,lsof 的优势在于同时给出用户、进程名与文件描述符编号,便于与取证记录对照。
基本信息
| 适用平台 | Linux 与多数 Unix;Windows 用 handle 或 Get-NetTCPConnection |
|---|---|
| 常用选项 | -i 网络文件 -p 指定进程 -u 指定用户 -c 指定命令名 -d 指定 fd |
| 解析控制 | -n 不解析主机名 -P 不解析端口名,排查时必加 |
| 性能提醒 | lsof 会遍历进程的文件描述符表,业务高峰期整机执行开销较大 |
| 权限要求 | 查看其他用户的进程需要 root 或具备 CAP_SYS_PTRACE 能力 |
| 特殊用法 | lsof +L1 列出已删除但仍被进程占用的文件,处置木马时非常有用 |
典型使用场景
- 已知端口要反查占用它的进程,决定处置顺序
- 已知可疑进程 PID 要看它的全部网络连接与打开文件
- 确认某账号名下的进程打开了哪些文件,判断是否在读写敏感数据
- 处置木马时找出「文件已删除但进程仍在运行」的样本,从 /proc 里把二进制捞出来
- 与 ss 结果交叉比对,提高连接证据的可信度
常用示例
常用示例
sudo lsof -i -nP | head -n 30 # 全部网络文件,加 -nP 避免解析
sudo lsof -i :22 -nP # 按端口反查进程
sudo lsof -p 1234 | grep -iE 'tcp|udp' # 按进程看它的网络连接
sudo lsof -i @203.0.113.10 -nP # 到指定地址的连接
sudo lsof -i -sTCP:LISTEN -nP # 只看监听
sudo lsof +L1 | head -n 20 # 已删除但被占用的文件
sudo lsof -u www-data -nP | grep -c ESTABLISHED # 按用户统计已建立连接输出逐列读法
| 列 | 含义 | 异常信号 |
|---|---|---|
| COMMAND / PID / USER | 进程名、进程号与运行账号 | 低权限账号持有对外长连接 |
| FD | 文件描述符编号与模式,如 3u、5w | 大量相同编号说明程序反复新建连接未释放 |
| TYPE | 文件类型:IPv4、IPv6、REG、DIR、FIFO、unix | unix 套接字大多为本地服务,需按进程判断 |
| DEVICE / SIZE/OFF | 设备号与文件大小或偏移 | 偏移持续增长说明文件正在被持续写入 |
| NODE | inode 编号 | 可与 /proc/<PID>/fd 对照,也用于找回被删文件 |
| NAME | 具体对象:路径或 本地地址:端口 到 对端地址:端口(状态) | 对端为陌生公网地址且端口高位,重点排查 |
lsof +L1 的实战价值很高:木马的二进制被删掉但进程还在跑时,文件会显示为 (deleted),此时用 cp /proc/<PID>/exe 就能把样本完整捞出来做哈希与检测,这是清理前必须完成的一步。
lsof 与 ss、ps 一样属于可能被 rootkit 污染的命令:结果异常或明显缺失时,回到 /proc/<PID>/fd 与 /proc/net/tcp 直接核对,或用静态编译的 busybox lsof 复核,不要只信单一工具的输出。
交叉验证
交叉验证
sudo ss -antp | grep -E 'ESTAB|LISTEN' | head -n 20 # ss 视角,输出更紧凑
sudo ls -l /proc/1234/fd | head -n 20 # 内核视角的文件描述符
sudo cat /proc/1234/net/tcp | head -n 10 # 该进程命名空间下的 TCP 表
sudo ls -l /proc/1234/exe # 可执行文件是否已删除
sudo lsof -p 1234 | wc -l # 与 ls -l /proc/1234/fd 行数对照输出量大时务必先过滤:在连接数上万的主机上直接跑 lsof -i 会消耗明显 CPU 与内存,建议先 ss 缩小范围,再用 lsof 对具体 PID 做精细核对。
与 ss 的分工:先用 ss 快速圈出可疑连接,再用 lsof 对具体 PID 做精细核对,两者结果不一致时以 /proc 里的内核数据为准。这样既控制开销,也避免只依赖单一工具造成误判。