lsof 用来做什么
lsof(list open files)在 Linux 中把“进程—文件—网络连接”三者的关系一次列全:-i 看网络连接,-p 看某个进程打开的全部资源,+L1 找链接数为 0 的文件,也就是已被删除但仍被进程占用的文件。事件响应现场常用它回答三个问题:哪个进程还在保持外联、某个可疑进程打开了哪些文件、有没有程序在占用已删除的载荷文件。输出信息量大,配合 -nP 禁用名称解析可以显著提速。
基本信息
| 适用平台 | 多数 Linux 发行版(RHEL/CentOS 7+、Ubuntu 18.04+ 等),需安装 lsof 包 |
|---|---|
| 权限要求 | 普通用户只能看到自己的进程;查看全部进程与 /proc 详情需要 root |
| 常用选项 | -nP 关闭主机名与端口名解析、-i 网络、-p PID、-u 用户、+L1 已删文件 |
| 输出列 | COMMAND、PID、USER、FD、TYPE、DEVICE、SIZE/OFF、NODE、NAME |
| 配合使用 | /proc/<pid>/fd 可进一步复制已删除文件内容 |
典型使用场景
- 现场确认哪个进程正在保持可疑的外联连接,拿到 PID 与对端地址
- 排查监听端口异常的进程:确认是否有非计划内的服务在监听
- 发现被删除但仍被占用的载荷文件,尝试从 /proc 恢复内容
- 定位文件占用冲突:确认某文件被哪个进程持有,便于安全释放
- 处置前固定证据:记录进程与连接的对应关系,避免直接重启丢失关联
常用命令
常用命令
# 已建立的 TCP 连接(-nP 避免反向解析,速度快且输出干净)
sudo lsof -nP -iTCP -sTCP:ESTABLISHED | head -20
# 某个进程打开的全部文件与网络句柄
sudo lsof -nP -p 1234
# 已删除但仍被占用的文件(链接数为 0)
sudo lsof +L1 | head -20
# 从 /proc 直接复制已删除文件内容,保住载荷本体
sudo cp /proc/1234/fd/7 /case/recovered-payload.bin
# 汇总某进程的外联目标,便于与情报比对
sudo lsof -nP -i -a -p 1234输出逐列读法
| 列 | 含义 | 正常/异常 |
|---|---|---|
| COMMAND / PID | 进程名与进程号 | 进程名被截断时用 PID 反查完整命令行 |
| USER | 持有该句柄的用户 | 服务进程以 root 运行属正常,交互用户持有大量连接需关注 |
| FD | 文件描述符 | cwd 当前目录、txt 程序本体、mem 内存映射、数字为普通句柄 |
| TYPE | 对象类型 | REG 普通文件、DIR 目录、IPv4/IPv6 网络套接字 |
| NODE | inode 号 | 已删除文件在 NAME 中标 (deleted),可据此恢复 |
| NAME | 路径或连接地址 | 含 (ESTABLISHED)/(LISTEN) 等状态,注意区分本地与对端 |
lsof 输出可能被攻击者通过动态库劫持污染(例如 LD_PRELOAD 隐藏进程),存在被隐蔽的可能时,要用 /proc 目录直接枚举交叉验证,而不是只信 lsof 的结果。
对连接数成千上万的主机执行全量 lsof 会消耗较多时间与 IO;先按端口或 PID 收窄范围,处置窗口紧张时优先记录关键进程的快照。