sudo でコマンドを実行すると、スイッチしたユーザーの環境変数が使われるものと思っていました。
RVMでRubyを入れて使っているのですが、sudo をかませて ruby を実行するとRVMで入れたrubyではなく、プリインストールのrubyが使われてハマることがありました。
sudo でスイッチ後のユーザーの環境変数を引き継ぐ方法をまとめました。
sudoを使う前と使った後の環境変数をみてみる
まずはsudoを使わずに環境変数やらを見てみます。
[bacchi@mitsuya ~]$ id
uid=200(bacchi) gid=1000(sysad) 所属グループ=1000(sysad),10(wheel)
[bacchi@mitsuya ~]$ ruby -v
ruby 1.8.7 (2013-06-27 patchlevel 374) [i386-linux]
[bacchi@mitsuya ~]$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/bacchi/bin:/usr/local/rvm/bin
次にsudoをして環境変数やらを見てみましょう。
[bacchi@mitsuya ~]$ sudo id
uid=0(root) gid=0(root) 所属グループ=0(root)
[bacchi@mitsuya ~]$ sudo ruby -v
ruby 2.2.2p95 (2015-04-13 revision 50295) [i686-linux]
[bacchi@mitsuya ~]$ sudo echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/bacchi/bin:/usr/local/rvm/bin
sudoをした後もユーザーの環境変数を引き継いだままです。
/etc/profile や .bashrc が読み込まれておらず、sudo 実行ユーザーの環境変数が使われています。
sudoで環境変数を引き継がせる
sudoを実行する場合、 そのユーザーの .bashrc や /etc/profile に定義してある設定を使用したいケースが多いのではないでしょうか。
そんな時は -i オプションをつけて sudo を実行してやればよいです。
[bacchi@mitsuya ~]$ sudo -i id
uid=0(root) gid=0(root) groups=0(root)
[bacchi@mitsuya ~]$ sudo -i ruby -v
ruby 2.2.2p95 (2015-04-13 revision 50295) [i686-linux]
[bacchi@mitsuya ~]$ sudo -i echo $PATH
/usr/local/rvm/gems/ruby-2.2.2/bin:/usr/local/rvm/gems/ruby-2.2.2@global/bin:/usr/local/rvm/rubies/ruby-2.2.2/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/usr/local/rvm/bin:/home/bacchi/bin:/usr/local/rvm/bin
/etc/profile や .bashrc が読み込まれています。
ruby もRVMで入れたものが使われていますね!
おまけ sudo で引き継がれる環境変数、引き継がれない環境変数
どの環境変数が引き継がれて、どの環境変数が引き継がれないのかは -V オプションで確認できます。
[root@mitsuya ~]# sudo -V
(省略)
正当性の確認を行う環境変数:
TERM
LINGUAS
LC_*
LANGUAGE
LANG
COLORTERM
削除する環境変数:
RUBYOPT
RUBYLIB
PYTHONUSERBASE
PYTHONINSPECT
PYTHONPATH
PYTHONHOME
TMPPREFIX
ZDOTDIR
READNULLCMD
NULLCMD
FPATH
PERL5DB
PERL5OPT
PERL5LIB
PERLLIB
PERLIO_DEBUG
JAVA_TOOL_OPTIONS
SHELLOPTS
GLOBIGNORE
PS4
BASH_ENV
ENV
TERMCAP
TERMPATH
TERMINFO_DIRS
TERMINFO
_RLD*
LD_*
PATH_LOCALE
NLSPATH
HOSTALIASES
RES_OPTIONS
LOCALDOMAIN
CDPATH
IFS
保護する環境変数:
XAUTHORITY
_XKB_CHARSET
LINGUAS
LANGUAGE
LC_ALL
LC_TIME
LC_TELEPHONE
LC_PAPER
LC_NUMERIC
LC_NAME
LC_MONETARY
LC_MESSAGES
LC_MEASUREMENT
LC_IDENTIFICATION
LC_COLLATE
LC_CTYPE
LC_ADDRESS
LANG
USERNAME
QTDIR
PS2
PS1
MAIL
LS_COLORS
KDEDIR
INPUTRC
HISTSIZE
HOSTNAME
DISPLAY
COLORS
(省略)