インフラエンジニアbacchiのわかったことまとめ

bacchi.me

sudo でスイッチ後のユーザーの環境変数を使う方法

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

(省略)
  • B!