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

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

新規登録して質問してみよう
ただいま回答率
85.48%
sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

Q&A

解決済

2回答

12336閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

0グッド

2クリップ

投稿2016/03/12 14:39

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

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

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

bash

1 2 sudo env | grep PATH #=> /sbin:/bin:/usr/sbin:/usr/bin 3#sudo -iでログイン時 4env | grep PATH #=> /usr/local/rbenv/shims:/usr/local/rbenv/bin:/usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin 5#su -でログイン時 6env | 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 7

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

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

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

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

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

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

sudoers

1Defaults env_reset 2Defaults env_keep = "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS" 3Defaults env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE" 4Defaults env_keep += "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES" 5Defaults env_keep += "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE" 6Defaults env_keep += "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY" 7 8Defaults 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の抜粋を再掲します。

sudoers

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

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

qt.sh

1if [ -z "${QTDIR}" ]; then 2 3 case `uname -m` in 4 x86_64 | ia64 | s390x | ppc64 ) 5 QT_PREFIXES="/usr/lib64/qt-3.3 /usr/lib/qt-3.3" ;; 6 * ) 7 QT_PREFIXES="/usr/lib/qt-3.3 /usr/lib64/qt-3.3" ;; 8 esac 9 10 for QTDIR in ${QT_PREFIXES} ; do 11 test -d "${QTDIR}" && break 12 done 13 unset QT_PREFIXES 14 15 if ! echo ${PATH} | /bin/grep -q $QTDIR/bin ; then 16 PATH=$QTDIR/bin:${PATH} 17 fi 18 19 QTINC="$QTDIR/include" 20 QTLIB="$QTDIR/lib" 21 22 export QTDIR QTINC QTLIB PATH 23 24fi

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

以上です。

投稿2016/03/12 17:53

nob777

総合スコア112

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/03/12 18:21

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

0

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

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

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

投稿2016/03/12 17:23

otn

総合スコア84533

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/03/12 17:51

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

2016/03/12 21: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 09:34

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問