sudoとpathとcommand not found

gitlabのavatar対策をどうするかを考えつつ、gitlabをmanual install環境でも同じなのかを試そうと思ったのだけれどこれがなかなかうまいこといかない。詰まった点は色々あるのだけれどそのうちの1つであるsudo時にコマンドが見つからない問題と解決方法を書く。

gitlabのmanual install時はbundleを実行する機会が多いのだけれど必ずcommand not foundと帰ってくる。絶対パス指定で実行するとコマンドが実行できるのでパスが通っていないのがわかる。

$ sudo -u git -H bundle
sudo: bundle: コマンドが見つかりません
$ sudo -u git -H /usr/local/bin/bundle
Could not locate Gemfile

手元の資料としてはmanualとgoogleぐらい。今回はman sudoから関係しそうなキーワードで検索してみた。とりあえずpathで検索をしたら以下のような記載があった。

環境変数
       sudo は以下の環境変数を利用する。

(中略)

       PATH            sudoers の secure_path オプションが設定されていれば、無難な値にセットされる

どうやら無難な値にセットされるらしい。sudoersのsecure_pathが関係しているのでvisudoからsecure_pathを検索すると以下の行を発見。

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin

無難なPATHがこのsecure_pathの内容だそうなので必要なパス(/usr/local/bin)を追加したらsudo -u git -H bundleが正常に実行できた。

sudoで実行する際は環境変数がそのまま引き継がれるわけでも実行ユーザの環境変数が使われるわけでもないみたい。引き継いで実行したい場合はsudoersをカスタマイズすることで可能とのこと。

あとgoogleで検索したらたくさん結果がでてきた。解決方法はsudoersを変更するものから環境変数を渡すものまで色々。sudoersの変更でも数種類の方法を提示しているところも。

わかってはいたけれどwebで調べた方が圧倒的に早いね。(情報量も多いし。)