sudo コマンドの "-i" オプションと "-E" オプションについて

sudo コマンドの "-i" オプションと "-E" オプションについてメモ。

・Man page of SUDO
https://linuxjm.osdn.jp/html/sudo/man8/sudo.8.html

■ -i オプションについて


ドキュメント曰く

パスワード・データベースの変身対象ユーザの項目でログイン・シェルとして指定されているシェルを実行する。すなわち、 .profile や .login といったログイン用のリソース・ファイルが、 シェルによって読み込まれることになる。

とのこと。これを指定すると $HOME/.bash_profile なりが読み込まれるということのようです。

動作確認を。

# cat /tmp/env/test.sh 
#!/bin/sh

echo $ETC_PROFILE
echo $BASH_PROFILE

# cat /etc/profile
- 略 -
export ETC_PROFILE=etc_profile
- 略 -

# cat /home/test/.bash_profile
- 略 -
export BASH_PROFILE=bash_profile
- 略 -

# sudo -u test sh -c /tmp/env/test.sh // -i オプション無しだと環境変数は設定されていない

# sudo -u test -i sh -c /tmp/env/test.sh // -i オプション有りだと環境変数が設定されている
etc_profile
bash_profile

■ -E オプションについて


こちらはドキュメント曰く

現在の環境変数をそのまま保持するのがユーザの意向だと、セキュリティポリシーに指示する。

とのことです。sudo 実行ユーザの環境変数がそのまま引き継がれるという感じです(セキュリティポリシーは今回は無視)

こちらも動作確認を。

# id
uid=0(root) gid=0(root) groups=0(root)

# echo $ETC_PROFILE
etc_profile

# echo $BASH_PROFILE

# sudo -u test -E sh -c /tmp/env/test.sh // root の環境変数として設定されている $ETC_PROFILE だけが設定されている
etc_profile

■ -i と -E が同時に指定された場合について


この場合、どうも -E の設定が効かないような動作になりました。以下の感じです。

# cat /tmp/env/test2.sh 
#!/bin/sh

echo $AAA
echo $BBB
echo $BASH_PROFILE

# id
uid=0(root) gid=0(root) groups=0(root)

# export AAA=aaa; export BBB=bbb

# echo $AAA
aaa

# echo $BBB
bbb

# sudo -u test -E -i sh -c /tmp/env/test2.sh // rootの環境変数 $AAA、$BBB は設定されていない


bash_profile

-i が「ログイン・シェルとして指定されているシェルを実行する」だから、引き継がれないのは当たり前なんですかね・・・(まったく確認なし・・・)

シェルにもっと詳しくなりたいもんです。


以上になります。

[環境情報]
CentOS 7
bash 4.2.46