netstat 在现代 Linux 仍可用但需 sudo -p 才显进程名,因权限限制无法读取 /proc;ss 和 lsof 更可靠,grep :80 需用 \b 避免误匹配,127.0.0.1:端口表示仅本地访问。

netstat 在现代 Linux 上仍能用,但必须加 -p 才能看到进程,且需 root 权限;不加 -p 或没权限时,你看到的只是端口状态,根本不知道谁在用。
为什么 netstat -tuln 看不到进程名
因为 -p 参数要求读取 /proc/[pid]/exe 和 /proc/[pid]/fd/,普通用户无权访问其他用户的进程信息。即使你运行了 netstat -tuln,输出里 PID/Program name 列会显示 - 或直接缺失。
- 必须用
sudo netstat -tulnp才可能看到完整进程名(如1234/nginx) - 某些容器或 systemd --user 服务下的进程,即使有 root 权限也看不到名称,此时
ss -tulnp或lsof -i :端口更可靠 - Ubuntu 22.04+/CentOS 8+ 默认不预装
net-tools,运行netstat --version报错就先装:sudo apt install net-tools或sudo dnf install net-tools
grep :80 为什么有时匹配不到
因为 netstat 输出中端口格式不统一:IPv4 是 0.0.0.0:80,IPv6 是 :::80,而 grep :80 只能匹配冒号后紧跟 80 的情况,漏掉 IPv6 行。
- 安全写法是
sudo netstat -tulnp | grep -E ':(80|:80)',或更干脆用sudo ss -tulnp | grep -E ':80\b' - 如果只关心 TCP,用
sudo netstat -tnlp能减少 UDP 干扰,加快过滤速度 - 注意
grep :80可能误中:8080,加\b边界符更准:grep ':80\b'
netstat -tulnp 输出里 Local Address 是 127.0.0.1:8080 意味着什么
这表示该服务只接受本机发起的连接,外部机器(包括同局域网其他设备)无法访问 —— 不是端口没起来,而是绑定范围太窄。
-
0.0.0.0:80:监听所有 IPv4 接口,可被外部访问 -
127.0.0.1:80:仅本地回环,curl http://localhost:80 可通,但 telnet 服务器IP 80 会失败 -
[::1]:80:IPv6 回环,效果同上;[::]:80才是监听全部 IPv6 地址 - 改配置通常要查服务主配置文件(如 Nginx 的
listen、Node.js 的server.listen(8080, '0.0.0.0'))
netstat 已过时,但别急着全换 ss
ss 确实更快、更轻量,参数也几乎兼容,但它默认不显示程序名的完整路径(比如只写 nginx 而非 /usr/sbin/nginx),排查多实例或自定义二进制时反而更费劲。
- 日常快速确认“谁占了 3000”:优先用
sudo lsof -i :3000,它字段清晰、无需记忆参数组合 - 要看协议级统计(如 TCP 重传数):
netstat -st仍有不可替代性,ss -s输出结构不同,不易直接对应 - 脚本中调用建议封装函数:
portcheck() { sudo ss -tulnp 2>/dev/null | grep ":$1\b" || sudo netstat -tulnp 2>/dev/null | grep ":$1\b"; }
真正容易被忽略的是:netstat 和 ss 都依赖内核网络栈快照,若进程刚启动或刚退出,存在极短时间窗口查不到;这时得去 /proc 下翻原始数据,比如 ls /proc/*/fd/ | xargs -r -I{} sh -c 'echo {}; ls -l {}/../fd/ 2>/dev/null | grep "socket:"' 2>/dev/null | grep :80——不过绝大多数场景,sudo lsof -i :端口 已经够用。

















