web-dev-qa-db-ja.com

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経由で実行すると、パスが異なるのはなぜですか?

43
Justin Ethier

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

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

これにより、Sudoでバイナリを実行するときにパスがクリーンになります。これは、懸念事項の一部から保護するのに役立ちます この質問に記載されています 。自分のパスに/sbin/usr/sbinがない場合にも便利です。

39
mattdm

コマンドsu -はrootユーザープロファイルを実行し、パスなどのユーザーの環境を引き継ぎます。Sudoはそれを行いません。

Sudosu -のように動作させたい場合は、オプションSudo -i [commandを使用して、ユーザーのプロファイルを実行します

su -Sudoのように動作させたい場合は、ハイフンを使用せず、su [command]を使用してください。

11
Andrew Yochum

Sudo sudo -Vを実行すると、why(違います)を確認できます。

たとえば、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


Sudoで環境が異なる可能性がある他の理由は、sudoersファイルでenv_resetオプションを有効にすることができるためです。これにより、新しい最小限の環境でコマンドが実行されます。

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

Defaults        env_reset
Defaults        env_keep += "PATH PYTHONPATH"
3
kenorb

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

したがって、プログラムはそれほど安全であるとは見なされず、デフォルトでルートPATHに置かれないと思います。

1
user unknown

私はこれを自分で試しましたが、あなたが見ている振る舞いを見ていませんでした-私のパスは同じままだったので、おそらくあなたのSudo設定が異なっています。チェックした場合man sudoersと呼ばれるオプションが表示されますsecure_pathをリセットしますPATH-このオプションが有効になっているようです。

1
Richard Downer

Sudo bashを使用する場合、bashはログインシェルとして機能しないためです。 Sudo bash -lでもう一度お試しください。su -と同じ結果が表示されます。

それが正しい場合、PATHの違いは構成ファイルにあります。/etc/profile~/.bash_profile~/.bash_login~/.profileがこの順序で実行されます)ログインシェルの場合、~/.bashrcは非ログインインタラクティブシェルの場合に実行されます。

1
phunehehe

古い質問ですが、この正確な問題を調査していたので、今ここで偶然見つけました。

何らかの理由で、/usr/local/binは、Sudo su -を介してrootになるときに、PATHにのみ存在していました。 Sudo -iを使用すると、そこにありませんでした。もちろん、/ etc/sudoersに追加できることはわかっていますが、su -の後にすでに存在する理由はまだわかりません。 PATHのこの部分はどこから来たのですか?

多くのgreppingと検索の後、私は答えを見つけました:

「/ usr/local/bin」を含むデフォルトのパスは、実際にはsu(1)にハードコードされています。

したがって、pam構成、プロファイル、bashrcなどは、この要素を選択的に追加する責任がありませんでした。 suが引き継いだとき、それは常にそこにありました。また、Sudosuをまったく呼び出さず、独自の構成を使用するため、Sudo -iの後に欠落していました

これはRHEL6とRHEL7に当てはまることがわかりました。他のバージョンやディストリビューションは確認していません。

1
Oscar