web-dev-qa-db-ja.com

`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)
...

これをTCP)に制限する方法(出力をgrepawksedなどの別のプログラムにパイプすることなく)ワイルドカードアドレスをリッスンしているソケット?試してみました:

$ 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に渡された条件を一般的に否定する方法はありますか?

5
benizi

lsofを使用する必要がありますか?

netstat -tulpnは、特定のポートでリッスンしているプロセスを表示します。すべてのIPをリッスンしているプロセスは、0.0.0.0と表示されます。

1
GeoSword

これはlsofでは実行できません。一致せずにワイルドカードアドレスを指定する方法はありませんjustワイルドカード:

_lsof -nP -sTCP:LISTEN [email protected]:1-65535
_

それを行うように見えますが、実際のワイルドカードアドレス(INADDR_ANY)と、セマンティック「ワイルドカード」、つまり任意のアドレスの両方をキャプチャします。興味深いことに、_[::]_はv6ワイルドカードの選択には使用できません。 lsofは否定をサポートしますが、アドレスはサポートしません。たとえば、ローカルホストを除外するために何かを行うことはできません。

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)の部分はプロセス名であり、ラベルによって混乱を招くように暗示されているユーザー名ではありません。

IMOは一般に、lsof出力を解析するよりもss出力をフィルタリングする方が簡単です。または、_/proc/net/tcp_の出力を直接処理します。

0