使用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)
...
有没有什么方法(无需将输出通过管道传输到另一个程序,例如grep
、awk
或sed
)将其限制为监听通配符地址的 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
。