いくつかのnetstatコマンドでgrepを使用するためにsudo privが必要なのはなぜですか?

いくつかのnetstatコマンドでgrepを使用するためにsudo privが必要なのはなぜですか?

システム:

  • 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出力を全画面表示に制御し、作成されたメッセージを処理しない場合など)。標準エラー)。

関連情報