我试图找出我的 Linux Ubuntu 机器上正在使用哪些端口。我正在读这篇文章如何在 Linux 或 Unix 上检查端口是否正在使用看到他们的命令之一是:
sudo lsof -i -P -n | grep LISTEN
我仍然对很多 Linux 命令不太熟悉,但我最近才了解lsof
用于列出所有打开的文件,所以我想了解这些标志的用途。
(-P 和 -n 标志是做什么用的?我已经看过手册,但它根本没有帮助。似乎 -i 标志是这里最重要的一个。)
我发现如果我在没有 -i 标志的情况下对“LISTEN”执行 grep,我得到的结果与使用时完全不同。
在手册中,它是这样说的:
-i [i] 该选项选择其 Internet 地址与 i 中指定的地址匹配的文件列表。如果未指定地址,则此选项将选择所有 Internet 和 x.25 (HP-UX) 网络文件的列表。
我真的不明白这意味着什么,并且绝对不明白它如何帮助我找出正在使用的端口。
答案1
-i
选择 Internet 文件或套接字。它与可选的地址参数一起使用。如果没有该参数,它将选择所有套接字。
您可以通过此选项使用其他过滤器来按 IPv4/IPv6、TCP/UDP 等进行选择。联机帮助页列出了几个示例:
-i 4
选择 IPv4 套接字,-i 6
选择 IPv6 套接字。-i TCP
或-i UDP
按协议选择。-i @hostname
或者-i @ipaddress
通过套接字绑定的接口的名称/IP 进行选择。-i :port
选择绑定到特定端口的套接字。
为了说明其他两个选项,请考虑以下示例。此条目来自我的系统,显示两个 CUPS 端口:
cupsd 855 root 9u IPv6 25870 0t0 TCP localhost:ipp (LISTEN)
cupsd 855 root 10u IPv4 25871 0t0 TCP localhost:ipp (LISTEN)
您会注意到该端口被指定为ipp
- Internet 打印协议。要将其转回数字,-P
请使用以下选项:
cupsd 855 root 9u IPv6 25870 0t0 TCP localhost:631 (LISTEN)
cupsd 855 root 10u IPv4 25871 0t0 TCP localhost:631 (LISTEN)
主机名在此处显示为 localhost。在较大的网络中,lsof
将努力通过查找来列出主机名。作为优化,您可以使用 跳过主机名解析步骤-n
。使用 时-n
,将显示 IP 地址而不是主机名:
cupsd 855 root 9u IPv6 25870 0t0 TCP [::1]:631 (LISTEN)
cupsd 855 root 10u IPv4 25871 0t0 TCP 127.0.0.1:631 (LISTEN)
顺便说一句,我喜欢使用该ss
命令来跟踪侦听端口。我常用的语法是ss -ltnp
,它表示:1) 显示侦听端口,2) 仅 TCP 端口,3) 不查找主机名,4) 显示进程 ID。结果如下所示(相同的 CUPS 端口):
LISTEN 0 5 127.0.0.1:631 0.0.0.0:* users:(("cupsd",pid=855,fd=10))
LISTEN 0 5 [::1]:631 [::]:* users:(("cupsd",pid=855,fd=9))