背景
sudoしたときにせっかく設定したruby
やらrubygem
が見つからないよって、言われて嫌な気持ちになったので対処方法を残しておく、
以下環境情報。
- ubuntu: 12.04
デフォルト設定
デフォルトの設定ではsudo
実行ユーザのPATH
は引き継がれずに、ユーザ固有のPATH
に指定したコマンドは失敗する。
path_not_found
$ gem list | head -5
bigdecimal (1.2.4)
fluent-logger (0.4.9)
hirb (0.7.2)
httpclient (2.3.4.1)
io-console (0.4.2)
$ sudo gem list | head -5
sudo: gem: command not found
$ env | grep PATH
PATH=/usr/local/rbenv/shims:/usr/local/rbenv/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
$ sudo env | grep PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
これはデフォルトの/etc/sudoers
が以下のようにsecurity_path
を指定してPATH
を固定しているため。
/etc/sudoers
#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults env_reset
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
# Host alias specification
設定変更
visudo
コマンドで以下のようにsecure_path
をコメントアウトして、env_keep
にPATH
を追加すれば、sudo
実行ユーザが使っていたコマンドが使えるようになる。
visudo(/etc/sudoers)
#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults env_reset
#Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
Defaults env_keep += "PATH"
env_keep
にはPATH
だけでなく環境変数で指定しているものはなんでも入れて良さげ。
ここで注意することは、PATH
を引き継いでしまうとsecurity_path
で指定されていた/sbin
などの管理系のコマンドのPATH
が設定されなくなってしまうので注意。
変更確認
以下のコマンドでPATH
が引き継がれていることを確認。
check_path
$ env | grep PATH
PATH=/usr/local/rbenv/shims:/usr/local/rbenv/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
$ sudo env | grep PATH
PATH=/usr/local/rbenv/shims:/usr/local/rbenv/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games
$
$ sudo gem list | head -5
bigdecimal (1.2.4)
fluent-logger (0.4.9)
hirb (0.7.2)
httpclient (2.3.4.1)
io-console (0.4.2)
$
おしまい。