ss -tuln高效列出监听端口:-t查tcp、-u查udp、-l筛listen态、-n禁dns解析,避免卡顿;加-p需sudo才显进程,替代方案可用lsof -itcp -stcp:listen -np。

直接运行 sudo ss -tuln 就能高效列出所有正在监听的 TCP 和 UDP 端口,不卡顿、不依赖额外软件,现代 Linux 发行版默认自带。
为什么用 ss -tuln 而不是其他组合
四个参数各有不可替代的作用:
- -t:只看 TCP 协议(不含 UDP)
- -u:只看 UDP 协议(不含 TCP)
- -l:仅筛选 LISTEN 状态——漏掉它会混入大量已建立连接,干扰判断
- -n:跳过 DNS 和服务名解析——避免因网络异常或 /etc/hosts 错误导致命令卡住几秒
合起来就是“只查监听态的 TCP/UDP 端口,且数字直出”,结果干净、响应快、脚本友好。
快速确认某个端口是否在监听
别只靠 grep :80,容易误匹配(比如把 :8080 或 :180 当成 80)。更稳妥的做法是:
- 检查 IPv4 的 80 端口:
ss -tuln | awk '$4 ~ /:80$/ {print}' - 同时覆盖 IPv4 和 IPv6:
ss -tuln | awk '$4 ~ /(:80|\[::]:80)$/ {print}' - 想写成一行判断语句(如用于脚本):
ss -tuln | awk '$1 ~ /^(tcp|udp)$/ && $4 ~ /:80$/ {exit 0} END{exit 1}',成功匹配时退出码为 0
想看到是哪个进程在监听,必须加 -p 并用 sudo
-p 参数能显示进程名和 PID,但需要 root 权限才能读取其他用户的 socket 信息。普通用户执行 ss -tulpn 会报错或留空。
- 正确用法:
sudo ss -tulpn,输出类似users:(("nginx",pid=1234,fd=6)) - 如果只关心某一个端口的归属:
sudo ss -tulpn | grep ':3306' - 没权限又必须查进程?可换用
sudo lsof -iTCP -sTCP:LISTEN -nP | grep ':3306',它原理不同,有时更可靠
常见干扰项和怎么避开
输出里有些行看着像监听,其实不是真正意义上的“开门”:
-
UNCONN状态(如 avahi-daemon、chronyd 的 UDP 行):表示未绑定的 socket,不是监听端口,可忽略 -
SYN-RECV:是半连接队列里的握手请求,不是 LISTEN,说明服务可能正被攻击或 accept 慢,ss -tuln根本不会显示它 - Docker 容器映射的端口(如宿主机 8080 → 容器 80):
ss查不到,因为监听实际发生在容器内部 netns,应改用docker ps --format "table {{.ID}} {{.Ports}}"或查 iptables 规则











