Ubuntu 10.10でroot権限を必要とするgemでrubygems(1.3.7)を使用しています。セットアップをrubygems1.3.6をインストールしたubuntu9.10と比較すると、gem environment
に次の違いがあります。
1.3.7/10.10 - EXECUTABLE DIRECTORY: /var/lib/gems/1.8/bin
1.3.6/09.10 - EXECUTABLE DIRECTORY: /usr/bin
Sudo
を使用するかどうかに関係なく、出力は同じです。これを修正するために(そもそもなぜ違うのかわかりません)、path変数を変更しようとしました。
私の質問は、Sudo
はどこで実行可能ファイルを探すのですか? (Sudo
を使用して)gemをインストールすると、実行可能ファイルは明らかに/var
パスに配置されます。このパスを~/.profile
ファイルと/etc/environment
ファイルに追加しましたが、実行可能ファイルを実行するためにSudo
を取得できません。
私が実行した場合:
$ gemname
ツールを正しく実行します。$ Sudo gemname
それは単にcommand not found
を教えてくれます。$ Sudo echo $PATH
itdoesは正しいパスを示します。$ Sudo -i gemname
正しく実行されます。$ Sudo sudo -V
は、PATHが保持されていることを示します。Sudo
は~/.profile
および/または/etc/environment
を尊重しますか?もしそうなら、ディレクトリが$PATH
環境変数に表示されているのに、なぜ実行可能ファイルが見つからないのですか?
Sudo
のドキュメントを読みました。また、stackoverflowとserverfaultに関する多数のトピックを検索して調べました(たとえば、 sudoでPATH環境変数をオーバーライドする方法は? ですが、例は、$PATH
に正しいパスが含まれていることを示しています)が、実際にはSudo
を介してgemを実行する方法を示していません。
3番目のコマンドでは、Sudoが表示する前にシェルが_$PATH
_を展開するため、出力はSudoが表示するPATHではなく、シェルのパスであることに注意してください。必要なのは_Sudo echo \$PATH
_または_Sudo sh -c 'echo $PATH'
_のようなものです。
それ以外にも、Sudo(8)
manページのSECURITYNOTESセクションを見てください。 UbuntuはSECURE_PATHビルドオプションを使用してSudo
をビルドすると思います。 _Sudo sudo -V
_の出力で「ユーザーの$ PATHをオーバーライドする値」の行を探します。
_Sudo -i
_は初期ログインをシミュレートするため、_.profile
_のようなファイルを読み取ります(ただし、読み取るファイルはルートのシェルによって異なります)。 _-i
_がないと、保存された環境変数が呼び出し元の環境から継承され、前述のPATHサニテーションが使用されます。
そもそもなぜパスが変わったのかというと、開発者側の意図的な選択だったのではないかと思います。 bugs.debian.org に関する詳細な議論を参照してください。
パーツごとに行きましょう:
それで大丈夫です :)
gemname
はあなたの$PATH
にありません
これはすばらしいことです。変数の展開は、bashがプログラムを実行する前に行われます。したがって、これを実行すると、ユーザー$PATH
before Sudoを呼び出すように展開されるため、Sudoに渡される行は次のようになります。
$ Sudo echo "/usr/bin:/bin:"
Sudo -i
はログインシェルとして実行され、.profile
および/または.login
を尊重します。 man
ページのように:
また、環境を初期化し、DISPLAYとTERMを変更せずに、HOME、MAIL、Shell、USER、LOGNAME、PATH、およびLinuxおよびAIXシステムの/ etc/environmentの内容を設定します。他のすべての環境変数は削除されます。