
PATH
/root/.bashrc ファイルの変数にカスタムパスを追加しました。
これにより、sudo su; echo $PATH
「/path/to/custom/bins」エントリが表示されます。
しかし、私はそうですsudo sh -c 'echo $PATH'
。
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
.bashrcファイルに追加されたフォルダパスは表示されません。
sudoコマンドはrootユーザーと同じ環境を持っていませんか?
答え1
.bashrc
これはbashの設定ファイルであり、対話型で実行されている場合にのみ有効です。これはbashを起動したときにのみロードされ、他のプログラムを実行してもロードされませんsh
(たとえば、bashを名前で呼び出すsh
)。そしてbashがインタラクティブであるときにのみロードされ、スクリプトを実行したり-c
。
sudo sh -c 'echo $PATH'
または、sudo bash -c 'echo $PATH'
インタラクティブシェルが呼び出されないため、.bashrc
関連しません。
sudo su; echo $PATH
ルートシェルの対話型インスタンスを実行します。 bashなら既に~root/.bashrc
ロードされています。このコードスニペットはインタラクティブシェルの終了時に実行されるため、インタラクティブecho $PATH
シェルで発生するすべてのアクションは、コードスニペットが最終的に印刷する内容には影響しません。ただしecho $PATH
、で始まる対話型シェルのプロンプトに入力すると、で設定されたsudo su
値が表示されます~root/.bashrc
。
ログインシェルではなくすべてのインタラクティブシェルで呼び出されるため.bashrc
(Bashの設計上の欠陥であるインタラクティブログインシェルでも呼び出されません)、環境変数は誤った場所で定義されます。.bashrc
キーバインディング、エイリアス、完成などのインタラクティブbash設定に使用されます。ログイン時にロードされたファイルに環境変数を設定します。~/.pam_environment
または~/.profile
。
したがって、代わりにPATH
設定してログインシェルの実行を使用するか、明示的なソースを使用してください。.profile
.bashrc
sudo -i 'echo $PATH'
.profile
sudo sh -c '. ~/.profile; echo $PATH'
答え2
ビュー-E
と-i
オプション。その抜粋は次のとおりですman sudo
。
-E
: ユーザーが既存の環境変数を保持するセキュリティポリシーを示します。ユーザーが環境を保護する権限を持っていない場合、セキュリティポリシーはエラーを返す可能性があります。
-i
: ターゲットユーザーのパスワードデータベースエントリで指定されたシェルをログインシェルとして実行します。これは、シェルがログイン固有のリソースファイル(または)を読み取ることを意味します.profile
。.login
コマンドが指定されると、-c
シェルのオプションで実行できるようにシェルに渡されます。コマンドを指定しないと、対話型シェルが実行されます。sudo
シェルを実行する前に、そのユーザーのホームディレクトリに変更してみてください。このコマンドは、ユーザーがログインしたときに受信するのと同様の環境で実行されます。コマンド環境sudoers(5)
-i
ポリシーを使用するときにこのオプションがコマンドが実行される環境にどのような影響を与えるかを説明するセクションがマニュアルにあります。sudoers
答え3
マンページ/ドキュメントに記載されているスタートアップファイルをsudo bash
読むことができます。ただし、環境変数が正しく設定されていない可能性があることに注意してください。この問題はシステム全体の起動ファイルで修正できます( で正確な場所はディストリビューションによって異なります)。 0についてテストしてください。bash
bash
HOME
bash
/etc
$uid