sudoとsuを介して実行するときにPATH変数が異なるのはなぜですか?

sudoとsuを介して実行するときにPATH変数が異なるのはなぜですか?

私のFedora VMで私のユーザーアカウントとして実行するとき、私のパス/usr/local/binには次のものがあります。

[justin@justin-fedora12 ~]$ env | grep PATH
 PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/justin/bin

ランタイムにも同じですsu

[justin@justin-fedora12 ~]$ su -
Password: 
[root@justin-fedora12 justin]# env | grep PATH
PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/justin/bin

ただし、経由で実行すると、sudoディレクトリは次のパスにありません。

[root@justin-fedora12 justin]# exit
[justin@justin-fedora12 ~]$ sudo bash
[root@justin-fedora12 ~]# env | grep PATH
PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/sbin:/bin:/usr/sbin:/usr/bin

で実行するときにパスが異なるのはなぜですかsudo

答え1

見てください/etc/sudoers。 Fedora(およびRHEL、Ubuntuなど)のデフォルトファイルには、次の行が含まれています。

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin

これにより、sudoでバイナリを実行してもパスがきれいになります。これはいくつかの問題を避けるのに役立ちます。この質問で言及されている。これは、1つもなく、独自の方法で行う場合/sbinにも/usr/sbin便利です。

答え2

このコマンドはsu -rootユーザープロファイルを実行し、ユーザーの環境(パスなどを含む)を想定しますが、これは何もしませんsudo

これを行うには、ユーザープロファイルを実行するオプションをsudo使用してください。su -sudo -i [command

su -これを行うには、ハイフンsudoを使用せずにハイフンを使用します。su [command]

答え3

確認できますなぜ(これは異なります)sudo sudo -V

たとえば、Linuxで実行している場合:

$ sudo sudo -V | grep PATH
Value to override user's $PATH with: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

注:macOS / BSDでは、以下を実行してくださいsudo sudo -V

上記のリストは、一部のLinuxディストリビューションのデフォルトのセキュリティポリシープラグインによって制限されています。


これについては以下で詳しく説明しますman sudoers

このオプションを設定すると、その値が環境変数secure_pathに使用されます。PATH

secure_path– sudo で実行される各コマンドに使用されるパス。 sudoを実行している人が通常の環境変数を持っていることを信頼していない場合は、この方法を使用できますPATH

別の用途は、「ユーザーパス」から「ルートパス」を分離したい場合です。このオプションで指定されたグループのユーザーexempt_groupは影響を受けませんsecure_path。このオプションはデフォルトでは設定されていません。

この場合、sudo visudo構成ファイルを実行および編集し、変更secure_path(区切り付きの追加パスを追加:)するか、ユーザーを追加して(オプションのexempt_group影響を受けません)、それを変更できます。secure_path

または、ユーザーにPATH一時値を渡すには、次のように実行できます。

sudo env PATH="$PATH" my_command

以下で確認できます。

sudo env PATH="$PATH" env | grep ^PATH

また見なさい:sudo保存する方法は$PATH


環境が異なる可能性があるもう1つの理由は、ファイルでオプションを有効にできるsudoことです。これにより、コマンドは新しい最小環境で実行されます。env_resetsudoers

env_keepしたがって、オプションを使用できます(推奨されません)。セキュリティ上の理由)ユーザーの環境変数を保存するには:

Defaults        env_reset
Defaults        env_keep += "PATH PYTHONPATH"

答え4

ほとんどのLinuxでは、パッケージ管理を通じてプログラムをインストールし、定期的に更新を受け取ります。パッケージ管理を迂回するエントリをインストールすると、/usr/local/bin (たとえば、.../sbin または /opt) にインストールされ、定期的なアップデートを受け取りません。

したがって、これらのプログラムは安全ではないと見なされ、デフォルトではルートパスに配置されません。

関連情報