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

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

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

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

Q&A

解決済

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

退会済みユーザー

退会済みユーザー

総合スコア0

sh

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

2回答

0グッド

0クリップ

11590閲覧

投稿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では読まれない設定になっ
ているような気がしていて,これを検証したいのですが何か良い方法は有りますでしょうか。
また,結論を知っている方いらっしゃれば教えていただきたいです。よろしくお願いいたします。

以下のような質問にはグッドを送りましょう

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

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

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

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

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

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

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

適切な質問に修正を依頼しましょう。

回答2

3

ベストアンサー

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

まず、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

skksky, lightson👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

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

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

このような回答には修正を依頼しましょう。

回答へのコメント

退会済みユーザー

退会済みユーザー

2016/03/12 18:21

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

2

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

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

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

投稿2016/03/12 17:23

otn

総合スコア80444

skksky👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

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

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

このような回答には修正を依頼しましょう。

回答へのコメント

退会済みユーザー

退会済みユーザー

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

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

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

同じタグがついた質問を見る

sh

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