私の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
経由で実行すると、パスが異なるのはなぜですか?
/etc/sudoers
をご覧ください。 Fedora(およびRHEL、Ubuntuなど)のデフォルトファイルには、次の行が含まれています。
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin
これにより、Sudoでバイナリを実行するときにパスがクリーンになります。これは、懸念事項の一部から保護するのに役立ちます この質問に記載されています 。自分のパスに/sbin
と/usr/sbin
がない場合にも便利です。
コマンドsu -
はrootユーザープロファイルを実行し、パスなどのユーザーの環境を引き継ぎます。Sudo
はそれを行いません。
Sudo
をsu -
のように動作させたい場合は、オプションSudo -i [command
を使用して、ユーザーのプロファイルを実行します
su -
をSudo
のように動作させたい場合は、ハイフンを使用せず、su [command]
を使用してください。
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
で環境が異なる可能性がある他の理由は、sudoers
ファイルでenv_reset
オプションを有効にすることができるためです。これにより、新しい最小限の環境でコマンドが実行されます。
したがって、env_keep
オプション( セキュリティ上の理由 の場合は推奨されません)を使用して、ユーザーの環境変数を保持できます。
Defaults env_reset
Defaults env_keep += "PATH PYTHONPATH"
ほとんどのLinuxでは、パッケージ管理を介してプログラムをインストールし、定期的にアップデートを取得します。パッケージ管理を回避するものをインストールすると、それは/ usr/local/bin(たとえば、...、/ sbin、または/ opt)にインストールされ、定期的な更新を取得しません。
したがって、プログラムはそれほど安全であるとは見なされず、デフォルトでルートPATHに置かれないと思います。
私はこれを自分で試しましたが、あなたが見ている振る舞いを見ていませんでした-私のパスは同じままだったので、おそらくあなたのSudo設定が異なっています。チェックした場合man sudoers
と呼ばれるオプションが表示されますsecure_path
をリセットしますPATH
-このオプションが有効になっているようです。
Sudo bash
を使用する場合、bash
はログインシェルとして機能しないためです。 Sudo bash -l
でもう一度お試しください。su -
と同じ結果が表示されます。
それが正しい場合、PATH
の違いは構成ファイルにあります。/etc/profile
、~/.bash_profile
、~/.bash_login
、~/.profile
がこの順序で実行されます)ログインシェルの場合、~/.bashrc
は非ログインインタラクティブシェルの場合に実行されます。
古い質問ですが、この正確な問題を調査していたので、今ここで偶然見つけました。
何らかの理由で、/usr/local/bin
は、Sudo su -
を介してrootになるときに、PATHにのみ存在していました。 Sudo -i
を使用すると、そこにありませんでした。もちろん、/ etc/sudoersに追加できることはわかっていますが、su -
の後にすでに存在する理由はまだわかりません。 PATHのこの部分はどこから来たのですか?
多くのgreppingと検索の後、私は答えを見つけました:
「/ usr/local/bin」を含むデフォルトのパスは、実際にはsu(1)にハードコードされています。
したがって、pam構成、プロファイル、bashrcなどは、この要素を選択的に追加する責任がありませんでした。 su
が引き継いだとき、それは常にそこにありました。また、Sudo
はsu
をまったく呼び出さず、独自の構成を使用するため、Sudo -i
の後に欠落していました
これはRHEL6とRHEL7に当てはまることがわかりました。他のバージョンやディストリビューションは確認していません。