sudo でコマンドを実行すると、「command not found」とエラーに。環境変数 PATH が通っていないと思って設定しても変わらず。実は sudoers の設定でセキュリティ上環境変数が初期化されている。そのときの対処備忘メモ。
現象
- sudo でコマンドを実行
- 「command not found」 (コマンドが見つかりません) とエラーに
- .bash_profile にパスを設定してみる
vi ~/.bash_profile
PATH=$PATH:$HOME/bin:/sbin:/usr/sbin
から
PATH=$PATH:$HOME/bin:/sbin:/usr/sbin:/usr/local/bin
に変更。
- sudo でコマンドを実行
- 再び「command not found」 (コマンドが見つかりません) とエラーでパスが通っていない
さらに突き詰めると、
sudoers の env_reset オプションが有効になっている
原因
sudoers の env_reset オプションが有効になっている場合、セキュリティ上環境変数が初期化されて secure_path に設定しているパスが使われるので、環境変数 PATH が通らない。
解決
3つの方法でパスを通す
sudoers はデフォルトでは env_reset オプションが有効になっている。無効化するか、環境変数を引き継ぐか、または secure_path にパスを設定することで環境変数 PATH を通す。
sudoers は visudo コマンドで編集できる。設定が間違っていたらエラーチェックもしてくれるので、直接ファイルを編集することは控える。
1. 無効化する場合
コメントアウトして env_reset オプションを無効化。
#Defaults env_reset
2. 環境変数を引き継ぐ場合
以下を追記
Defaults env_keep += "PATH"
そして以下をコメントアウト
#Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin
.bash_profile に設定したパスが通ります。
3. パスを設定する場合
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin
から
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin
に変更してパスを追加
sudo でコマンドを実行して確認。
complete!!
教訓
環境変数 PATH の設定の他、env_reset が有効化されているかどうかも確認しよう。