sudo とsudo -i と su - の違いと読み込まれる環境変数の違いについて
解決済
回答 2
投稿
- 評価
- クリップ 2
- VIEW 7,932
お世話になっております。
先ほどの質問で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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
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が設定されないロジックになっています。
以上です。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+2
bashを起動する段階の前で、sudo と su によって与えられる PATH の初期値が異なっているためだと思います。
少なくとも/usr/local/bin
の差はそれです。
/usr/lib64/qt-3.3/bin
はわたしの環境には無いのでわかりません。
これを検証したいのですが何か良い方法は有りますでしょうか。
/etc/profile
の先頭に、echo $PATH
を入れるといいかと思います。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 89.96%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2016/03/13 03:21
疑問が全て解消されました。
ありがとうございました。