lsof -P 仅禁用端口名解析,不用于检测隐藏监听;真正识别异常需结合 -iTCP -sTCP:LISTEN -n 定位监听进程,再通过 sudo lsof -d txt -p 或 readlink -f /proc//exe 查看二进制绝对路径,重点研判是否位于 /tmp、/dev/shm、/var/tmp 等非常规路径。

注意:lsof -P 本身不用于“查看被隐藏的异常监听”,它只是禁用端口名解析(显示数字端口而非 service 名)。真正定位非标准路径下的异常监听,关键在于结合 -i、-n、-sTCP:LISTEN 等筛选逻辑,并辅以进程路径分析——因为“隐藏在非标准路径”指的是进程二进制文件不在 /usr/bin、/usr/sbin 等常规位置,而非常规监听端口(如 31337、4242)只是线索之一。
直接看监听进程及其可执行文件路径
运行这条命令能一次性获取所有 TCP LISTEN 进程 + 数字端口 + IP 地址 + PID + 命令名 + 实际启动路径:
sudo lsof -iTCP -sTCP:LISTEN -P -n -F pcL
但更实用、可读性更强的是:
sudo lsof -iTCP -sTCP:LISTEN -P -n | awk '{print $1,$2,$9,$NF}' | column -t说明:
-
-iTCP -sTCP:LISTEN:只抓 TCP 监听态,排除 ESTABLISHED/UDP/连接中等干扰项 -
-P:端口显示为数字(如8080而非http-alt) -
-n:IP 显示为数字(如0.0.0.0而非*或主机名),避免 DNS 查询延迟和混淆 - 输出字段含
COMMAND(进程名)、PID、NODE(本地地址:端口)、NAME(部分含路径,但常被截断)
要真正看到完整可执行文件路径,必须加 -d txt 并配合 -p PID 查单个进程:
sudo lsof -d txt -p <PID> | grep -E '^(COMMAND|NAME)'
例如发现某进程监听 0.0.0.0:31337,PID 是 12345:
sudo lsof -d txt -p 12345
输出中 NAME 列即为该进程的二进制绝对路径(如 /tmp/.x/agent、/dev/shm/update.bin、/var/tmp/.cache/ld.so),这才是判断“是否藏在非标准路径”的核心依据。
快速筛查可疑路径的监听进程
可一步过滤出常见异常路径特征(如 /tmp、/dev/shm、/var/tmp、. 开头、无扩展名、无签名路径):
sudo lsof -iTCP -sTCP:LISTEN -P -n -F p | xargs -I{} sh -c 'PID={}; echo "$PID $(sudo lsof -d txt -p $PID 2>/dev/null | tail -1 | awk "{print \$9}")"' | \
grep -E '/(tmp|shm|cache|\.)/|^\S+\s+\S+[^/]*$|\.so$|\.bin$|\.elf$'更稳妥的手动方式是:
- 先列出所有监听:
sudo lsof -iTCP -sTCP:LISTEN -P -n | grep -v "127.0.0.1\|::1" | sort -k9
- 关注
NODE列不是127.0.0.1:*或::1:*的行(即对外暴露) - 对应 PID 查路径:
sudo readlink -f /proc/<pid>/exe</pid> - 检查路径是否异常:是否在
/tmp、/dev/shm、/var/tmp;是否带随机字符串;是否无写权限但有执行权限;是否属 root 但路径不可信
补充:为什么不能只靠 -P?-P 只影响端口显示格式,不增强检测能力。真正的“隐藏”体现在:
- 进程路径非常规(如
/tmp/.X11-unix/.lock-...) - 使用
ptrace或LD_PRELOAD注入后监听(此时lsof -d txt显示原始进程,需结合cat /proc/<pid>/maps</pid>看内存映射) - 容器或命名空间隔离导致
lsof在宿主机看不到(需进容器执行)
所以,lsof -P 是基础配置项,不是检测手段本身。重点永远是:先定位监听进程 → 再确认其二进制来源路径 → 最后人工研判路径合理性。
H3 常见异常路径特征参考
-
/tmp/.*、/dev/shm/.*、/var/tmp/.*(临时目录执行二进制极可疑) - 路径含随机字符串:
/tmp/krn67b8a、/dev/shm/.cache_20260501 - 文件名无扩展名但
file检测为 ELF:/tmp/agent、/var/run/svc - 属主是普通用户但监听公网端口(如
nobody启动监听0.0.0.0:4444) -
ls -l /proc/<pid>/exe</pid>显示(deleted)(原文件已被删,仅内存驻留)
H3 配合其他命令交叉验证
- 查进程启动命令行:
cat /proc/<pid>/cmdline | tr '\0' ' '</pid> - 查父进程及关系:
ps -o pid,ppid,comm -p <pid></pid> - 查文件完整性(若怀疑被篡改):
sha256sum /proc/<pid>/exe</pid>(注意:对已删除文件会报错) - 查 SELinux 上下文(如启用):
ls -Z /proc/<pid>/exe</pid>
不复杂但容易忽略


















