sudo エコーパスは、sudo で実行するために使用されるパスを表示しません。

sudo エコーパスは、sudo で実行するために使用されるパスを表示しません。

私は次のことについて混乱しています。

[user@QVr740-11 ~]$ which ninja
/usr/local/bin/ninja
[user@QVr740-11 ~]$ sudo which ninja
which: no ninja in (/sbin:/bin:/usr/sbin:/usr/bin)
[user@QVr740-11 ~]$ sudo echo $PATH
/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/user/.local/bin:/home/user/bin

ls -l /usr/local/bin/ninjaこれは、バイナリがroot:rootによって所有され、誰もが実行できる(3つのx)を示し、$PATHsudoの場合でもパスに存在するはずですが、実行しようとするとwhichパスが何とか変更されたことを示しています。

sudo -Eこの動作は変更されません。

何を提供しますか? $ PATHは保存されますか?他の場所でパスを探していますwhich(このバイナリをsudoとして実行できないことに注意してください)。

答え1

ここには2つの質問があります。

  1. この$PATH変数は、コマンドが実行される前に拡張されます。最終結果は次のとおりです。うまくいきますが、実際に欲しいものではありません。

    sudo echo /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/user/.local/bin:/home/user/bin
    
  2. $PATH通常、セキュリティ上の理由でリセットされます。sudo

これを使用して、アプリケーションが実行されているコンテキストでsudo env | grep ^PATH=値を見つけることができます。このファイルの編集に使用されるパスを調整することで、構文チェックの利点を得ることができます。$PATHsudo/etc/sudoerssudo visudo今後ファイルを変更しました。

答え2

読むman sudo sudoers。このコマンドは、簡単なセキュリティホールを避けるために意図的sudoにユーザーのコマンドを無視します。$PATH

関連情報