質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.96%

sudo とsudo -i と su - の違いと読み込まれる環境変数の違いについて

解決済

回答 2

投稿

  • 評価
  • クリップ 2
  • VIEW 7,932

tkow

score 1198

お世話になっております。

先ほどの質問でsudoやsuの理解を深めたくなり,色々検証してみたのですが,

sudoで読み込まれるPATHと,su -でログインしてから読み込まれているPATHを調べると,
違いがあることを確認しました。なぜこのような違いが起こるか自分で考えてみたところ,
su - はbashを実行しているので,どこかでPATHが追記されているのだと思いそれぞれの
PATHを調べてみたところ以下のような出力を得ました。

sudo env | grep PATH #=> /sbin:/bin:/usr/sbin:/usr/bin
#sudo -iでログイン時
env | grep PATH      #=> /usr/local/rbenv/shims:/usr/local/rbenv/bin:/usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin 
#su -でログイン時
env | grep PATH #=>/usr/local/rbenv/shims:/usr/local/rbenv/bin:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin


sudoと他の二つの環境変数が違うのは解るのですが,sudo -iとsu -でログインした時にPATHに含まれる
値が異なるのはなぜでしょうか。予想では,profileかrcのどちらかがsudo -iでは読まれない設定になっ
ているような気がしていて,これを検証したいのですが何か良い方法は有りますでしょうか。
また,結論を知っている方いらっしゃれば教えていただきたいです。よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+3

解決済みのようですが、情報共有します。

まず、sudo -iとsu -で読み込まれるプロファイルおよび順序は同じ
です。また、最初に読み込まれるのは/etc/profileです。

・/usr/local/binについて
bashのマニュアルには明記されていませんので、推測になります
がbash起動時かそれ以前で設定していると思われます。

sudo -i時の場合、/etc/profileを読み込む前に/etc/sudoersに
設定されたルールに従って、環境変数が大きく更新されます。

下記は/etc/sudoersの抜粋です。

Defaults    env_reset
Defaults    env_keep =  "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS"
Defaults    env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE"
Defaults    env_keep += "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES"
Defaults    env_keep += "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE"
Defaults    env_keep += "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin

sudoのマニュアルにも記載されているとおり、設定済みの環境変数
は一部(※)を除いて、クリアされます。
その後、secure_pathに指定されているPATHが追加されます。
(/etc/profileの先頭でPATHを確認してください)
sudo -i側に/usr/local/binが無いのはsecure_pathに指定していない
からです。

(※)一部引き継がれる環境変数というのは、上記のenv_keep行が該当します。

・/usr/lib64/qt-3.3/binについて
sudo -i時に読み込まれる/etc/sudoersの制御による差異です。
/etc/sudoersの抜粋を再掲します。

Defaults    env_reset
Defaults    env_keep =  "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS"
Defaults    env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE"
Defaults    env_keep += "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES"
Defaults    env_keep += "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE"
Defaults    env_keep += "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"


上記でQTDIRに着目してください。
/etc/profile内で/etc/profile.d/qt.shを読み込みます。
qt.shの内容は下記のとおりです。

if [ -z "${QTDIR}" ]; then

    case `uname -m` in
       x86_64 | ia64 | s390x | ppc64 )
          QT_PREFIXES="/usr/lib64/qt-3.3 /usr/lib/qt-3.3" ;;
       * )
          QT_PREFIXES="/usr/lib/qt-3.3 /usr/lib64/qt-3.3" ;;
    esac

    for QTDIR in ${QT_PREFIXES} ; do
      test -d "${QTDIR}" && break
    done
    unset QT_PREFIXES

    if ! echo ${PATH} | /bin/grep -q $QTDIR/bin ; then
       PATH=$QTDIR/bin:${PATH}
    fi

    QTINC="$QTDIR/include"
    QTLIB="$QTDIR/lib"

    export QTDIR QTINC QTLIB PATH

fi

上記のとおり、QTDIRに値が設定されている場合は、PATHに
/usr/lib64/qt-3.3/binが設定されないロジックになっています。

以上です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/03/13 03:21

    素晴らしい解説ありがとうございます。
    疑問が全て解消されました。
    ありがとうございました。

    キャンセル

+2

bashを起動する段階の前で、sudo と su によって与えられる PATH の初期値が異なっているためだと思います。
少なくとも/usr/local/binの差はそれです。
/usr/lib64/qt-3.3/binはわたしの環境には無いのでわかりません。

これを検証したいのですが何か良い方法は有りますでしょうか。 

/etc/profileの先頭に、echo $PATHを入れるといいかと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/03/13 02:51

    ありがとうございます。
    ということはsudoとsuコマンドの内部でPATHの初期化をしている処理があるということですよね。納得できました。

    キャンセル

  • 2016/03/13 06:51

    > ということはsudoとsuコマンドの内部でPATHの初期化をしている処理があるということですよね。
    そうですね。
    su や login では root の場合、/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin 、そのたユーザーの場合 /usr/local/bin:/bin:/usr/bin が設定されるようです。sudo の場合は /etc/sudoers の設定次第です。

    キャンセル

  • 2016/03/13 18:34

    わかりました!ありがとうございます!
    またお力添えしていただけることがあったらよろしくお願いします。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.96%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる