システム:
- 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出力もポケットベルをバイパスして少し見えますが、ポケットベルは印刷および/または削除がほとんど保証されます。