私の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_reset
sudoers
env_keep
したがって、オプションを使用できます(推奨されません)。セキュリティ上の理由)ユーザーの環境変数を保存するには:
Defaults env_reset
Defaults env_keep += "PATH PYTHONPATH"
答え4
ほとんどのLinuxでは、パッケージ管理を通じてプログラムをインストールし、定期的に更新を受け取ります。パッケージ管理を迂回するエントリをインストールすると、/usr/local/bin (たとえば、.../sbin または /opt) にインストールされ、定期的なアップデートを受け取りません。
したがって、これらのプログラムは安全ではないと見なされ、デフォルトではルートパスに配置されません。