![sudoコマンドでPATHがリセットされるのはなぜですか? [コピー]](https://linux33.com/image/50144/sudo%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%A7PATH%E3%81%8C%E3%83%AA%E3%82%BB%E3%83%83%E3%83%88%E3%81%95%E3%82%8C%E3%82%8B%E3%81%AE%E3%81%AF%E3%81%AA%E3%81%9C%E3%81%A7%E3%81%99%E3%81%8B%EF%BC%9F%20%5B%E3%82%B3%E3%83%94%E3%83%BC%5D.png)
レンガの壁に何度も触れた後、私は次の事実を見つけました。
$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/steve/bin
$ sudo bash
# echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin
しかし、
$ sudo bash -c 'echo $PATH'
/sbin:/bin:/usr/sbin:/usr/bin
$ sudo bash -Ec 'echo $PATH'
/sbin:/bin:/usr/sbin:/usr/bin
私から集めたその他の投稿パスはsudo
次から読み取られます/etc/sudoers
。ところで、なぜそうなのでしょうか?設定は$PATH
意味がありますか/root/.profile
、それともこれが上記の混乱の原因$PATH
ですかsudo
?
RHEL 6.4でbashを使用しています。
答え1
保護
sudo
これらのコマンドのいくつかを実行するときに知ることができる保護機能が組み込まれています。これらの保護は、セキュリティの強化など、さまざまなタスクを実行できます$PATH
。
/etc/sudoers
ドキュメントから:
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin
これはコマンドの実行時に表示される内容ですsudo -c ....
。-E
切り替えてこの動作を無効にできますsudo
。
メモ:一部の設定では、この-E
スイッチは効果がありません。これを「解決」するには、を使用できますsudo env "PATH=$PATH" bash
。これにより、$PATH
現在の電流がsudo
環境に転送されます。
対話とログイン
このコマンドを実行すると:
$ sudo bash
bash
ログインシェルと対話型シェルを実行していますbash
。これはbash
設定ファイルのソースに関連しています。
- インタラクティブ、別名
bash
またはbash -i
、源泉$HOME/.bashrc
- ログインしてください。
bash -l
、源泉$HOME/.bash_profile
それでは、なぜ機能しないのですか-E
?
この質問に対するTylerRickの答え(sudoはルートを変更します - なぜ?)多くの理由が扱われます。主sudo
にUbuntuの場合と同様に、コンパイル時にハードコードされ、これらのスイッチを無駄にします。 Launchpadには長い間解決されていない未解決の問題があり、Canonicalはこの動作をデフォルトにするのが最善だと思ったことに気づきました。
答え2
ルールがsudoers
ユーザーに特定のコマンドを実行する権限を付与する場合は、通常wibble
セキュリティ値を設定する必要がありますPATH
。つまり、ユーザーが自分のプログラムを植えることができないディレクトリのみを含める必要があります。wibble
外部コマンドが呼び出され、foo
リセットがPATH
ない場合、ユーザーは~/bin
コマンドの前にリンクPATH
を置き、呼び出しを実行して/bin/sh
任意のシェルコマンドを入力できます。~/bin/foo
sudo wibble
~/bin/foo
したがって、PATHをリセットするのは安全なデフォルトです。すべての場合にこれが必要なわけではありませんが、デフォルトに設定する方が簡単で安全です。
ルールsudoers
に従ってユーザーにランダムなコマンドを実行する権限が与えられている場合、PATHをリセットしても直接的なセキュリティ上の利点はありません。また、間接的な利点もあります。つまり、ユーザーが不要なプログラムを含むPATHを誤って設定でき、PATHをリセットすると、これらのプログラムが誤って呼び出されるリスクを回避できます。機能的な利点もあります。 rootでコマンドを実行するには通常、および/usr/local/sbin
が/usr/sbin
必要です/sbin
が、通常のユーザーでは必要ありません。
実行時にパスがリセットされたくない場合は、次の場所sudo
で免疫グループに自分自身を追加してくださいsudoers
。
Defaults exempt_group+=stevebennet
ログインシェル(sudo -I
またはsudo bash -l
他の方法)を実行している場合、シェルは通常ターゲット.profile
ユーザーのホームディレクトリを読み取り、そのファイルがPATHを変更する可能性があります。
答え3
これはセキュリティ上の理由です。 PATHは、元のユーザーが持つことができるハッキングされたPATHではなく、明確に定義されたパスに設定されます。
バラよりhttps://superuser.com/questions/98686/passing-path-through-sudo回避策として。