在我的系统上,如果我运行某个端口的 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
与 不同netstat
,lsof
需要 root 权限才能打印系统上的所有开放端口。尽管lsof
manpage 建议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。