lsof 不显示已建立的 TCP 连接

lsof 不显示已建立的 TCP 连接

在我的系统上,如果我运行某个端口的 netstat,它会返回:

$ netstat -nat | grep "60964"
tcp        0      0 192.0.0.1:60964             0.0.0.0:*            LISTEN      
tcp       59      0 192.0.0.1:60964             192.0.0.6:46962      ESTABLISHED

如果我运行 lsof:

$ lsof -i4 | grep "60964"
process_x  2585 root  189u  IPv4  12708      0t0  TCP 192.0.0.1:60964 (LISTEN)

为什么这里的输出会有差异?为什么 lsof 没有检测到“已建立”的连接。

谢谢!

编辑:我应该提到我是以 root 身份运行上述命令。

答案1

与 不同netstatlsof需要 root 权限才能打印系统上的所有开放端口。尽管lsofmanpage 建议lsof在 Linux 上安装 setuid root,在 BSD 和许多其他 Unix 上安装 setgid,但实际上大多数安装都选择不这样做。(是否应该打开这些权限是另一个问题。)

因此lsof仅显示当前用户执行的任何进程的连接。要获取完整的连接列表,请lsof以 root 权限运行。

答案2

你有没有尝试过

lsof -i TCP -sTCP:ESTABLISHED

答案3

我能想到的唯一可能性是端口号被列为服务名称而不是端口(请参阅 /etc/services)。添加“-P”参数将阻止此端口名称列表,而仅列出端口号。

我在我可以访问的 Ubuntu 和 RedHat 服务器上没有看到 60964 的端口服务名称,所以这看起来真的很奇怪。

您已经评论说您正在以 root 身份运行 lsof - 因此所有进程都应该可见。从评论中的 Abel Cheung 问题中,我们知道 lsof 不会因 DNS 查询而挂起,也不会显示该套接字。不需要列出套接字状态 - 也不需要指定 PID。

相关内容