关于本文
本文使用生成式 AI 辅助自动化流程创建。我们参考了 Linux 的 ss(8) 手册和 TCP RFC 9293,梳理了将监听端口与进程关联查看的诊断步骤。验证状态:🧪 已确认第一手资料 · 已在 Debian 13 上验证 0 条结果/非法输入/LISTEN 的逻辑 · 尚未在 Ubuntu 实体机上验证
在 Ubuntu 中查询“谁在监听这个端口?” — 使用 ss 关联 socket 与进程
如果在 Ubuntu 中想查清“是谁在占用 5000 端口?”,可以通过 ss 筛选出 TCP 的 LISTEN socket,并在需要时进一步确认进程信息。
ss -lntpH "sport = :5000"
只需这一行命令,即可筛选出处于 TCP 监听状态、数值显示、包含进程信息、无表头的结果。
拆解选项
| 选项 | 含义 |
|---|---|
-l | 显示处于监听状态的 socket |
-n | 不转换为服务名,以数字形式显示地址和端口 |
-t | 显示 TCP socket |
-p | 显示正在使用 socket 的进程信息 |
-H | 不显示表头行 |
使用 -H 不仅能缩短输出外观,在本脚本中,它还便于判定“若对应的 socket 为 0 个则输出为空”。
按 进程 → socket → IP:端口 的顺序查看
flowchart LR
A[process / PID] --> B[TCP socket]
B --> C[LISTEN state]
C --> D[local IP : port]
D --> E[接続を待つ]
不要只看端口号,将“哪个进程绑定到了哪个本地地址,以及该 socket 是否在监听”这一整条链路串联起来看,会更容易理解。
127.0.0.1 和 0.0.0.0 意义不同
例如,假设 5000 端口呈现如下状态:
127.0.0.1:5000 0.0.0.0:5000 [::]:5000
127.0.0.1:5000表示在 IPv4 回环地址上监听。通常用于同一台 PC 内部使用的配置。0.0.0.0:5000是 IPv4 的未指定地址,用作监听多个本地 IPv4 地址的通配符。[::]:5000是 IPv6 的未指定地址。是否同时接收 IPv4 连接取决于操作系统和 socket 配置,切勿仅凭显示结果盲目下定论。
仅凭“5000 端口已打开”这一句话,无法得知外部是否能够访问。绑定地址、防火墙、路由等需要另外确认。
有时可能无法看到进程信息
即便带上了 -p,也可能由于执行用户的权限限制,导致无法充分显示其他进程的详情。
遇到这种情况,建议先确认 socket 本身是否存在;如果确实需要进程信息,在权衡权限必要性后,使用 sudo 重新确认。
sudo ss -lntpH "sport = :5000"
与其默认每次都加 sudo,不如分清究竟是哪些信息因为权限不足而未显示,这样会更安全。
当没有输出时
如果此过滤器没有输出任何内容,则可以判断为“在此次检查中,未发现本地正在监听 TCP 5000 端口的 socket”。
不过,以下情况属于别的问题:
正在使用 UDP 5000 端口 →
-t无法显示位于不同的 network namespace 内部
服务在启动后不久崩溃退出
连接拒绝或通信失败的原因在于防火墙等因素
不能断言“ss 中没有显示 = 应用的配置一定有误”。
本地逻辑确认
于 2026-09-07 在 Debian GNU/Linux 13、Bash 5.2.37、iproute2 6.15.0 环境下,对未使用的端口、非法输入、localhost 的临时 TCP LISTEN 这 3 种情况进行了验证。尚未在 Ubuntu 实体机上进行验证。
