sudo コマンドは /root/.bashrc をソースしません。

sudo コマンドは /root/.bashrc をソースしません。

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.bashrcsudo -i 'echo $PATH'.profilesudo sh -c '. ~/.profile; echo $PATH'

答え2

ビュー-E-iオプション。その抜粋は次のとおりですman sudo

-E: ユーザーが既存の環境変数を保持するセキュリティポリシーを示します。ユーザーが環境を保護する権限を持っていない場合、セキュリティポリシーはエラーを返す可能性があります。

-i: ターゲットユーザーのパスワードデータベースエントリで指定されたシェルをログインシェルとして実行します。これは、シェルがログイン固有のリソースファイル(または)を読み取ることを意味します.profile.loginコマンドが指定されると、-cシェルのオプションで実行できるようにシェルに渡されます。コマンドを指定しないと、対話型シェルが実行されます。sudoシェルを実行する前に、そのユーザーのホームディレクトリに変更してみてください。このコマンドは、ユーザーがログインしたときに受信するのと同様の環境で実行されます。コマンド環境sudoers(5)-iポリシーを使用するときにこのオプションがコマンドが実行される環境にどのような影響を与えるかを説明するセクションがマニュアルにあります。sudoers

答え3

マンページ/ドキュメントに記載されているスタートアップファイルをsudo bash読むことができます。ただし、環境変数が正しく設定されていない可能性があることに注意してください。この問題はシステム全体の起動ファイルで修正できます( で正確な場所はディストリビューションによって異なります)。 0についてテストしてください。bashbashHOMEbash/etc$uid

関連情報