sudo実行時に$PATHが通っていない場合の設定

Pocket

さくら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)

この違いがあるのに何故コメントアウトでも実行できるのかがよく分からなかった。

関連記事

Pocket

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です