用 ss——它是每个现代 Linux 发行版的现行标准,而 netstat 在那里是遗留品:在 Ubuntu、Fedora 和 Debian 上,这个二进制如今装在可选的 net-tools 包里,而 ss is built into 内置于 iproute2,处处都装着。 在繁忙的服务器上也更快,因为它直接从内核读套接字统计,而不是逐个文件去翻 /proc。麻烦在语法——所以这一页就是那份翻译。
用 ss——每个现代发行版的现行标准;netstat 在那里是遗留品,甚至常常根本没装。
旗标一一对应:netstat -tlpn → ss -tlpn, netstat -tulpna → ss -tulpna。路由和接口搬去了 ip route / ip -s link.
一行揪出端口:sudo ss -ltnp 'sport = :8080'——进程名和 PID 直接返回。
老手册里的每一条 netstat 命令,以及它变成了什么——每行从左往右读:
全部 TCP + UDP 连接ss -tulpnaip routeip -s linkss -sss -tnp 'sport = :22'头两行完全相同——碰巧 ss 的短旗标在常见场景下与 netstat 对齐,所以肌肉记忆大多能在搬家后幸存
在 Linux 上,实际上是的。net-tools 包——netstat, ifconfig, route — has not tracked modern kernel features for years and is no longer installed by default on any major distribution. It still exists, still runs, and there is nothing to uninstall, but new features land only in iproute2 (the package behind ss and ip——多年没有跟进现代内核特性,在任何主流发行版上都不再默认安装。它还在、还能跑,但新特性只落在
netstat,除非你手动安装 net-tools——这就是为什么那么多人搜“netstat 的等价物”:那个二进制干脆不在了。ss 原生支持这些。netstat 活得好好的——netstat -ano 仍是把 PID 对应到监听端口的标准做法。只有 Linux 这边算废弃。 意为“套接字统计”:内核对每个 TCP、UDP 和 Unix 套接字的视角——状态、地址、端口、进程、计时器、队列深度。 means "socket statistics": the kernel's view of every TCP, UDP and Unix socket — state, addresses, ports, processes, timers, queue depths.
# 所有监听中的,连同属主进程
sudo ss -tulpn
逐旗标:TCP(-t)、UDP(-u)、仅监听(-l)、显示进程(-p)、数字输出——不做 DNS 查询(-n)。sudo 对 -p 很重要:没有 root 你能看到端口,但拿不到不属于自己的套接字的进程名。再给两条覆盖大部分工作的单行命令:
# 与端口 443 之间的所有已建立连接,带进程
sudo ss -tnp 'sport = :443 or dport = :443'
# 汇总表:每种状态各有多少套接字
ss -s
这套过滤语法相对 netstat 的“grep 加祈祷”是货真价实的升级——它在内核里执行,所以是精确匹配,不是文本对碰。
伸手拿这两样工具最常见的理由:
sudo ss -ltnp 'sport = :8080'
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 511 *:8080 *:* users:(("node",pid=214113,fd=18))
那个 users:(...) 字段直接给出进程名和 PID——不用敲第二条命令。端口被占却看不到进程?你多半在看一个属于另一个网络命名空间的套接字——一个容器。从宿主机上,sudo ss -ltnp shows the port with an empty process column; match it with docker ps or nsenter into the container's namespace. Prefer a dedicated tool? 干同样的活,而且在 macOS 和多数 BSD 上表现一致,所以它还能留在手册里——但在 Linux 上, does the same job and works identically on macOS and most BSDs, which is why it survives in runbooks — but on Linux, 本来就在。 is already there.
验证:sudo ss -ltnp 'sport = :8080' → users:(("node",pid=…)) · 换成任何 1–65535 的端口都行
因为你要么在很老的发行版上(2007 年前、iproute2 还没成标准),要么——可能性大得多——根本不在 Linux 上。ss 不是 macOS 命令;macOS 自带 lsof and netstat 但没有 ss,多数 BSD 同样如此。Windows 上用:netstat -ano or PowerShell's (PowerShell)。如果你确实在 Linux 上且缺了它,装 iproute2:. If you genuinely are on Linux and it is missing, install iproute2: sudo apt install iproute2 (Debian/Ubuntu) or sudo dnf install iproute2(Fedora/RHEL)。
验证:ss -V → 第一行出现版本字符串
两个诚实的情形。可移植性:在 Linux、AIX、老 BSD 混编的机队里,netstat 是唯一到处都在的语法。肌肉记忆的延续——老手册里写着 netstat -tlpn 而机器装了 net-tools,它照常工作。否则默认用 ss 并更新手册——顶上那张翻译对照表才值得贴在显示器上。而你找到的端口属于一个起不来的服务时,那是 systemd 的故事,不是套接字的故事。
ss -ltnp 示例输出来自一台开发机的真实抓取(:8080 上的 node 进程),重新键入而非杜撰。翻译对照手册到此为止 · 未取一分毫 · 一切皆本地