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

おすすめ記事