システム:
- Ubuntu 20.04.06
- ネットワークツール2.10 - アルファ
- grep (GNU grep) 3.4
sudoなしでnetstatを実行すると、ポート情報は表示されますが、プロセス情報は表示されません。これは、プロセス情報に高い権限が必要であるため、予想される現象です。
$ netstat -tulpn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:43445 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:41933 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:42649 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:46059 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:45983 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:5001 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:5433 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:5432 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:34903 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:37257 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:37081 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:38445 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:38335 0.0.0.0:* LISTEN -
tcp6 0 0 ::1:3350 :::* LISTEN -
tcp6 0 0 ::1:631 :::* LISTEN -
tcp6 0 0 :::2377 :::* LISTEN -
tcp6 0 0 :::3389 :::* LISTEN -
tcp6 0 0 :::22 :::* LISTEN -
tcp6 0 0 :::25 :::* LISTEN -
tcp6 0 0 :::111 :::* LISTEN -
tcp6 0 0 :::443 :::* LISTEN -
tcp6 0 0 :::7946 :::* LISTEN -
tcp6 0 0 :::5001 :::* LISTEN -
tcp6 0 0 :::5433 :::* LISTEN -
tcp6 0 0 :::5432 :::* LISTEN -
udp 0 0 127.0.0.53:53 0.0.0.0:* -
udp 0 0 0.0.0.0:111 0.0.0.0:* -
udp 0 0 0.0.0.0:631 0.0.0.0:* -
udp 0 0 0.0.0.0:4789 0.0.0.0:* -
udp 0 0 0.0.0.0:5353 0.0.0.0:* -
udp 0 0 0.0.0.0:43294 0.0.0.0:* -
udp6 0 0 :::52206 :::* -
udp6 0 0 :::111 :::* -
udp6 0 0 :::5353 :::* -
udp6 0 0 :::7946 :::* -
ただし、その出力をgrepに送信しようとすると、sudo privが必要であるというエラーが発生します。なぜ?標準出力にはプロセス情報は表示されません。 grepがこれを変更するのはなぜですか?
$ netstat -tulpn | grep 8080
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
トラブルシューティング:
-p
含めないと、netstat -tuln | grep 8080
これは発生しません(例:netstat -tulpn | grep 8
より小さい文字列(例:- を使用しても
ss
同じ問題は表示されません(例ss -tulpn | grep 8080
:)
ここで何が起こっているのでしょうか?
注:はい、netstatは廃止され、使用する必要があることがわかりますss
。この現象が発生する理由は不思議です。
答え1
このメッセージを常に受け取る可能性が高いが、いつ変更されたメッセージを受け取りました。
grep をバイパスすると、メッセージが stderr に送信されます。だからあなたがそれを見るとき、いくつかの競争条件があります。
netstatは、データを印刷する前に解析後すぐにオプションを印刷できます。 grepがすぐにデータ印刷を開始すると、メッセージが他の出力と混在して見逃されたり、最終的に印刷されることがあります。 grepに時間がかかると、このメッセージが出力の先頭に表示されることがあります。
バッファリングとパイプによるランダムな遅延がない場合、メッセージは常に先頭になければなりません。
メッセージを無視したい場合は試してみることができます
netstat -tulpn 2> /dev/null | grep 8080
grepでメッセージを常にフィルタリングすることを試みることができます(bashなどの最新のシェルの場合)。
netstat -tulpn /dev/null |& grep 8080
またはそれに対応するもの(すべてのシェルについて)
netstat -tulpn 2&>1 | grep 8080
ネイティブコマンドをポケットベルにパイプすると、stderr出力もポケットベルをバイパスして少し見えますが、ポケットベルは印刷および/または削除がほとんど保証されます。
答え2
指摘したように、netstat
いくつかの情報を表示するには、rootとして実行する必要があります。grep
パイプからデータを読み取るために特別な権限は必要ありません。だから、
sudo netstat -tulpn | grep 8080
root権限がない場合、-p
このフラグはあなたに属していないプロセスに関する詳細を表示するように指示されたときに常に警告をトリガーします。おそらくメッセージが表示されなかった可能性があります(特に結果をポケットgrep
ベルに送信する場合は、たとえばless
出力を全画面表示に制御し、作成されたメッセージを処理しない場合など)。標準エラー)。