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)に制限する方法(出力をgrep
、awk
、sed
などの別のプログラムにパイプすることなく)ワイルドカードアドレスをリッスンしているソケット?試してみました:
$ 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
に渡された条件を一般的に否定する方法はありますか?
lsof
を使用する必要がありますか?
netstat -tulpn
は、特定のポートでリッスンしているプロセスを表示します。すべてのIPをリッスンしているプロセスは、0.0.0.0と表示されます。
これは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
_の出力を直接処理します。