已知PID时,用sudo ss -tulnp | grep "pid=$PID"可查该进程监听的所有端口,关键看Local Address:Port列;lsof需加-a参数才能查到网络连接,如sudo lsof -a -p $PID -iTCP -sTCP:LISTEN -P -n;netstat则用sudo netstat -tunlp | grep "$PID/"确保精准匹配。

当你已经知道某个进程的PID,需要确认它到底监听了哪些端口(比如排查Nginx悄悄开了8081、8082多个管理端口),必须绕过服务名模糊匹配,直接从内核套接字状态反查该PID绑定的所有网络地址和端口。
用ss命令按PID过滤监听端口
执行 sudo ss -tulnp | grep "pid=$PID",其中 $PID 替换为实际数字(如 1234);注意双引号不能省,否则 shell 无法正确识别 pid= 字符串模式。
这条命令会输出所有包含该 PID 的监听行,包括 TCP 和 UDP;若只关心 IPv4 的 TCP 监听,改用 sudo ss -tlnp | grep "pid=$PID" 可避免 IPv6 地址干扰。
输出中 Process 字段形如 users:(("nginx",pid=1234,fd=6)),【fd=6 表示这是第6号文件描述符,不是端口号】,真正要读的是 Local Address:Port 列,例如 *:8080 或 127.0.0.1:9001。
用lsof按PID列出全部网络连接
方法一:直接查进程打开的网络文件
运行 sudo lsof -a -p $PID -i,-a 表示逻辑“与”,强制同时满足 -p 和 -i 两个条件,避免漏掉非 LISTEN 状态的连接(如已建立的管理连接)。
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
方法二:只看 LISTEN 态的 TCP 端口(最常用)
执行 sudo lsof -a -p $PID -iTCP -sTCP:LISTEN -P -n,-P -n 确保端口显示为纯数字,不因 /etc/services 缺失或 hosts 异常导致字段错位。
注意:不加 -a 时,lsof -p $PID 默认只列进程打开的普通文件,不会自动包含网络套接字;漏掉 -a 就查不到任何端口。
用netstat交叉验证(兼容旧系统)
第一步:确保 net-tools 已安装,否则执行 sudo apt install net-tools(Debian/Ubuntu)或 sudo yum install net-tools(RHEL/CentOS)。
第二步:运行 sudo netstat -tunlp | grep "$PID/",结尾斜杠是关键——它能精准锚定 PID 字段开头,避免匹配到端口号含相同数字的情况(如 PID=80 误匹配 :8080)。
第三步:观察输出中的 Local Address 列,格式为 0.0.0.0:3306 或 :::22;IPv6 地址用方括号包裹,如 [::]:80,需手动识别冒号后数字即端口号。

















