それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

su/sudo したときの環境変数が気になったので調べた。

sudo su したときの環境変数と、自分の環境変数がどうなってるのか知りたい。
sudo su -l したときの環境変数と sudo su の環境変数がどうなっているのか知りたい。

rvm で環境作ってると、環境変数を意識しておかないとgem install しても入ってなかったり。そんなことが起きて環境ぐちゃぐちゃになるのでちゃんと意識しておきたいと思った。

環境変数をリセットしてsu / sudo するには次の方法がある。

  1. sudoersに env_reset を書く
  2. su -l オプションで su する (unixlinuxで違う?)

調べてみた。

とにかく調べてみるのが一番。

su したときと su -l したときの環境変数


左が su -l 、右が単純なsu

su と su -l では環境変数が異なる。うん、そうだよね。

su したときの環境変数 と takuya の環境変数


左がsu の環境変数 。右がtakuyaの環境変数
su だけだとtakuyaの環境変数が持ち込まれているのが分かる。

sudo su したときの環境変数と、自分の環境変数

左がsudo su の環境変数 。右がtakuyaの環境変数

環境変数はまっさらになってる。



sudo su -l したときの環境変数と sudo su の環境変数

左がsudo su -l の環境変数 。右がsudo suの環境変数

pwdが違うのは、新しいシェルを起動したときにhomeへ移動したかどうかの違い
-l つけると新しいbashが起動するみたい。





比較しした結論。

su では環境変数はそのまま
su -l で環境変数がリセットされる。
sudoしたときは環境変数がリセットされる。(設定次第)

環境変数がリセットされるのは重要

とくに、rvmなどのユーザ固有ローカルパッケージを使っていて、システム環境を触るときに重要。

sudoしたときに環境変数を持ち越すかどうか

sudoしたとき環境変数がリセットされてるのは、次のsudoersファイルの設定の効果



sudoersの設定で環境変数をリセットして初期化して sudo しているのが分かる。

sudoersで環境変数をリセットを標準にする

Defaults env_reset,

を書いておけば基本的に環境変数リセット。

su -l の -l オプション

Macのmanには次のように書いてあった。

     -l      Simulate a full login.  The environment is discarded except for HOME, SHELL, PATH, TERM, and USER. 
             HOME and SHELL are modified as above.
             USER is set to the target login.
             PATH is set to ``/bin:/usr/bin''. 
             TERM is imported from your current environment.  The invoked shell is
             the target login's, and su will change directory to the target login's home directory.

su の -l オプションではなく "-" を使う

DebianのManには次のように書いてあった。

 su はログインセッション中に別のユーザになるために用いる。 ユーザ名を指定せずに起動した場合、
 デフォルトではスーパーユーザの ID に変更する。
  オプション引数 - を用いると、 直接ログインした場合と同じ環境に初期化される。

というわけで、「su - 」でもおなじらしい