Debian(sarge)でsudo gem〜ってしたいんだけど、動かない(未解決)

気がついたら2時間粘ってる。sudoには詳しくなれたが解決はしていない。
Blogなどを参考にRubyGemsをインストールするときに発行するコマンドが

$ sudo gem install rails


ってな感じになるんですが、Debian(Sarge)だと

sudo: gem: command not found


って動かないんですよ。gemをフルパスで指定すると

$ sudo /opt/local/bin/gem install rails
/opt/local/bin/gem:9:in `require': no such file to load -- rubygems (LoadError)
from /opt/local/bin/gem:9


今度は環境変数GEM_HOMEも参照できない模様。しょうがないので、suしてgemしてたんですが、いい加減、気にくわないので、ちゃんと調べてみた。でも、解決しなかった!
問題点は2つありまして

  • 環境変数PATHが使えない
  • 環境変数GEM_HOMEが使えない

どっちも環境変数だし、同じ原因だろうと思っていたんですが、後者は解決できたんですが、前者は特例扱いらしく未だにダメです。
原因はsudoコマンドのセキュリティ強化のようです。
CVE – CVE-2005-4158 (under review)

Sudo before 1.6.8 p12, when the Perl taint flag is off, does not clear the (1) PERLLIB, (2) PERL5LIB, and (3) PERL5OPT environment variables, which allows limited local users to cause a Perl script to include and execute arbitrary library files that have the same name as library files that are included by the script.

ブラックリスト方式からホワイトリスト方式なったと。同時にリストを操作する方法も追加されたので、変更してみました。スーパーユーザでvisudoを実行すると/etc/sudoersがエディタで開かれるので以下の行を追加。

Defaults env_keep+="PATH GEM_HOME RUBYLIB"


env_keepという変数に+=で値を追加しています。PATHとGEM_HOMEとRUBYLIB。詳しくはsudoers(5)を参照してください。
これで後者は解決しました。gemをフルパスで指定すると無事に起動しました。しかし、PATHについては利用してくれない・・・。
いろいろを見てみたところ、

$ echo $PATH
/opt/local/rubygems/bin:/opt/local/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin
$ printenv PATH
/opt/local/rubygems/bin:/opt/local/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin
$ sudo echo $PATH
/opt/local/rubygems/bin:/opt/local/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin
$ sudo printenv PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin


変数には設定されているけど、環境変数には設定されていない・・・?sudoが強制的に初期化している気がします。初期値がどこに入っているのかを探したのですが、見つからず。そろそろソースコード見なきゃいけない領域に入ってしまったので、後日に回します。
しかし、まぁ

$ sudo `which gem` install rails


で実行できるようになったのは、小さいながらも成果だと思いたい。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする