sudo -Eはホームディレクトリにある特定のコマンドを実行できませんか?

sudo -Eはホームディレクトリにある特定のコマンドを実行できませんか?

兆候:

$ sudo -E adb
sudo: adb: command not found

$ which adb
/home/usr/opt/android/platform-tools/adb

$ sudo -E echo ${PATH}
...:/home/usr/opt/android/platform-tools

$ stat ~/opt/android/platform-tools/adb
Access: (0775/-rwxrwxr-x)  Uid: ( 1000/ usr)   Gid: ( 1000/ usr)

@リチャード、ありがとう。私はこれをしました:

$ echo 'echo $PATH' | sudo sh
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
$ echo 'echo $PATH' | sudo -E sh
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

したがって、sudoのパスにはありません。しかし、sudoが一時的にPATHを尊重するようにするにはどうすればよいですか?

答え1

まったくそうではありません! (環境の PATH には/home/usr/opt/android/platform-toolsありません。) 実行する前にシェルで評価するので、in の値ではなく isstart より前の値を置き換えてください。sudo${PATH}sudoPATHsudosudo

あなたの疑いは正しいですPATH。ただし、評価の順序により、テストでは誤った回答が得られます。

あなたはする必要がありますsudo -E /home/usr/opt/android/platform-tools/adb

答え2

ご存知のように、sudoリセットを使用すると、$PATH実行するユーティリティのフルパスを指定でき、ほとんどの単純なケースでは正常に動作します。ただし、場合によっては予約が必要な場合があります。たとえば、プログラムが$PATH提供されているプログラムの中に見つからない他の$PATHプログラムを呼び出す必要がある場合ですsudo

最も簡単な方法は次のとおりです。

sudo env PATH="$PATH" mycmd

これはシェルの評価順序を利用します。実行する前に展開する$PATHと、実際には次のようになります。sudo

sudo env PATH="/usr/local/sbin:/usr/local/bin:..." mycmd

sudoその後、 を呼び出すと指示どおりに設定され、 を呼び出しenvます。$PATHmycmd

これはsudo、アクセスが制限されず、すべてのコマンド(またはすべてのコマンド)を実行できる場合にのみ機能しますenv

関連情報