查找正在侦听特定端口的进程

mis*_*yes 5 networking tcp netstat

例如,我想找到一些在指定端口上运行的进程80

我跑了

fuser 80/tcp
Run Code Online (Sandbox Code Playgroud)

并一无所获

进而

netstat -tulpn|grep "80\|PID"
Run Code Online (Sandbox Code Playgroud)

并得到了

Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 :::80                       :::*                        LISTEN      -  
Run Code Online (Sandbox Code Playgroud)

PID 是-

那么是什么-意思呢?谢谢!

mpy*_*mpy 3

简短的回答是:您需要这样root才能看到所有绑定。

稍微长一点:

netstat 的联机帮助页给出了并非在所有情况下都必需的提示:

PID/程序名称 拥有套接字的进程的进程 ID (PID) 和进程名称的斜杠分隔对。 --program导致该列被包含在内。您还需要超级用户权限才能在不属于您的套接字上查看此信息。

因此,作为普通用户,您只能看到哪个进程侦听端口(如果您拥有该端口):

$ netcat -l -p 1234 &
$ netstat -tulpn
[...]
tcp        0      0 0.0.0.0:1234            0.0.0.0:*               LISTEN      8044/netcat     
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      -    
[...]
Run Code Online (Sandbox Code Playgroud)

您可以看到“您的”netcat 进程,但看不到谁正在侦听例如端口 22。

我有一种感觉,原因是您无法访问/proc/[PID]/fd非拥有的进程。在那里你会发现文件描述符进程[PID]当前已打开,并且在 Un*x 中(几乎)一切都是文件......套接字也是如此。

在我的示例中sshd,pid 3934 监听端口 22(惊喜-惊喜):

$ whoami
user
$ ls -l /proc/3934/fd
/bin/ls: cannot open directory /proc/3934/fd: Permission denied
$ sudo ls -l /proc/3934/fd
total 0
lrwx------ 1 root root 64 Apr 24 16:33 0 -> /dev/null
lrwx------ 1 root root 64 Apr 24 16:33 1 -> /dev/null
lrwx------ 1 root root 64 Apr 24 16:33 2 -> /dev/null
lrwx------ 1 root root 64 Apr 24 16:33 3 -> socket:[10481]
lrwx------ 1 root root 64 Apr 24 16:33 4 -> socket:[10483]
Run Code Online (Sandbox Code Playgroud)

(第二个套接字绑定到 IPv6 地址,我在 netstat 输出中省略了该地址。)