Найти процессы, прослушивающие подстановочный адрес в `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)
...
Есть ли способ (без передачи вывода в другую программу, например 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
?
2 ответа
Вы должны использовать lsof
?
netstat -tulpn
покажет процессы, которые слушают на любом данном порту. Процессы, прослушивающие все IP, будут отображаться как 0.0.0.0:
Это не может быть сделано с lsof
, Нет никакого способа указать адрес подстановочного знака без сопоставления только с подстановочным знаком:
lsof -nP -sTCP:LISTEN -i@0.0.0.0: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
непосредственно.