さくらVPSの新プランに移行して、Rubyをソースからインストールするなど環境を構築しているとき、一般ユーザでsudoコマンド経由でbundle installやgemが使えないことが分かった。
$ sudo bundle install sudo: bundle: command not found
環境変数の$PATHが通ってないのかと思い、フルパスで指定してみると実行できた。
$ sudo /usr/local/bin/bundle install
ググって調べてみるとsudo実行時に環境変数を渡したりしている人もいるみたいだった。
ぱっと思いつく方法は$PATHが通っているらしい/usr/bin/にシンボリックリンクを貼ることだ。
ln -s /usr/local/bin/bundle /usr/bin/bundle
しかし、コマンド毎に設定するのも面倒だ。
CentOS6になって、sudoのデフォルト設定が変わったのかもと、visudoを確認してみる。
設定の中にsecure_pathという設定項目があることがわかった。
※CentOS5系の設定情報にはsecure_pathは書いていなかった。
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin
ここに、/usr/local/bin/を追加するか、コメントアウトすることによってsudo経由でbundleやgemを実行できるようになった。
PATHの追加
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/local/bin:/usr/bin
コメントアウト
#Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin
余談
PATHを追加した場合はwhichで確認するとちゃんと表示されるが、コメントアウトの場合はwhichでは見つからない。
PATH追加の場合 $sudo which bundle /usr/local/bin/bundle コメントアウトの場合 $ sudo which bundle which: no bundle in (/usr/bin:/bin:/usr/sbin:/sbin)
この違いがあるのに何故コメントアウトでも実行できるのかがよく分からなかった。