在“lsof”中查找监听通配符地址的进程

在“lsof”中查找监听通配符地址的进程

使用lsof,我可以找到所有使用 TCP 套接字监听连接的进程:

lsof -Pni -sTCP:LISTEN

例如:

COMMAND   PID   USER  FD  TYPE  DEVICE SIZE/OFF NODE NAME
cupsd     662   root  7u  IPv6   11108      0t0  TCP [::1]:631 (LISTEN)
cupsd     662   root  8u  IPv4   11109      0t0  TCP 127.0.0.1:631 (LISTEN)
rsyncd    905   root  4u  IPv4   13379      0t0  TCP *:873 (LISTEN)
...

有没有什么方法(无需将输出通过管道传输到另一个程序,例如grepawksed)将其限制为监听通配符地址的 TCP 套接字?尝试过:

$ lsof -Pni @0.0.0.0 -sTCP:LISTEN
lsof: incomplete Internet address specification: -i @0.0.0.0

$ lsof -Pni @\* -sTCP:LISTEN
lsof: unknown host name (*) in: -i @*

或者,有没有什么方法可以一般性地否定传递给的条件lsof

答案1

你一定要用吗lsof

netstat -tulpn将显示正在侦听任何给定端口的进程。侦听所有 IP 的进程将显示为 0.0.0.0:

答案2

这无法通过 来实现lsof。没有办法指定通配符地址而不进行匹配只是通配符:

lsof -nP -sTCP:LISTEN [email protected]:1-65535

似乎可以做到,但它捕获了实际通配符地址 (INADDR_ANY) 以及语义“通配符”,即任何地址。有趣的是,[::]对于 v6 通配符选择是不可接受的。lsof支持否定,但不支持地址,因此例如您无法执行某些操作来过滤掉 localhost。

可以这样做,ss(8)但是进程名称很难解析。

# ss -nlt src 0.0.0.0
State    Recv-Q    Send-Q        Local Address:Port        Peer Address:Port
LISTEN   0         128                 0.0.0.0:22               0.0.0.0:*        users:(("sshd",pid=939,fd=3))

""上面( )中的部分sshd是进程名称,而不是标签中容易引起混淆的用户名。

lsof我认为过滤输出通常比解析输出更容易ss。或者直接处理输出/proc/net/tcp

相关内容