目的
sudo コマンドを使うときは、オプションによって、環境変数が引き継がれたり引き継がれなかったりするので、重要な事項を抑える。
環境
EC2 ubuntu
具体例
sudo の環境変数は ubuntu ユーザの環境変数とは異なる。
sudo の環境変数は主に /etc/sudoers に定義され、PATH環境変数は /etc/environment に定義されている。
sudo -i は root としてログインし直すので、sudo のみの場合の環境変数に加えて、/root/.bashrcの環境変数もロードする。
sudo -E は、PATH以外の環境変数を引き継ぐ。
環境変数は -E や --preserve-env オプションによって引き継ぐことができる。
$ export MY_TEST_ENV='abcde'
$ printenv | grep MY_TEST_ENV
MY_TEST_ENV=abcde
$ sudo printenv | grep MY_TEST_ENV
$ sudo -i printenv | grep MY_TEST_ENV
$ sudo -E printenv | grep MY_TEST_ENV
MY_TEST_ENV=abcde
$ sudo --preserve-env=MY_TEST_ENV printenv | grep MY_TEST_ENV
MY_TEST_ENV=abcde
$ sudo --preserve-env=PATH,MY_TEST_ENV printenv | grep MY_TEST_ENV
MY_TEST_ENV=abcde
PATH 環境変数は、-E オプションによって引き継げない場合がある。(/etc/sudoers の Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin" という記述が原因)
sudo でも PATH 環境変数を引き継ぎたい場合は、下記のように --preserve-env=PATH を使うか、この記事で提案されている方法を使う。
$ printenv | grep PATH
PATH=/home/ubuntu/.vscode-server/cli/servers/Stable-38c31bc77e0dd6ae88a4e9cc93428cc27a56ba40/server/bin/remote-cli:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
$ sudo printenv | grep PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
$ sudo -i printenv | grep PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
$ sudo -E printenv | grep PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
$ sudo --preserve-env=PATH printenv | grep PATH
PATH=/home/ubuntu/.vscode-server/cli/servers/Stable-38c31bc77e0dd6ae88a4e9cc93428cc27a56ba40/server/bin/remote-cli:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
$ sudo --preserve-env=MY_TEST_ENV,PATH printenv | grep PATH
PATH=/home/ubuntu/.vscode-server/cli/servers/Stable-38c31bc77e0dd6ae88a4e9cc93428cc27a56ba40/server/bin/remote-cli:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
ついで
(1)
echo は先に環境変数が展開されるので、sudo コマンドは影響しない。
$ export MY_TEST_ENV='abcde'
$ echo $MY_TEST_ENV
abcde
$ sudo echo $MY_TEST_ENV
abcde
$ sudo -i echo $MY_TEST_ENV
abcde
$ sudo -E echo $MY_TEST_ENV
abcde
$ printenv | grep MY_TEST_ENV
MY_TEST_ENV=abcde
$ sudo printenv | grep MY_TEST_ENV
$ sudo -i printenv | grep MY_TEST_ENV
$ sudo -E printenv | grep MY_TEST_ENV
MY_TEST_ENV=abcde
(2)
$ whoami
ubuntu
$ sudo whoami
root
$ sudo -i whoami
root
$ sudo -E whoami
root
sudo -i は root としてログインし直すので、実行ディレクトリは下記のように /rootとなっていることにも注意されたい。
~/test$ pwd
/home/ubuntu/test
~/test$ sudo pwd
/home/ubuntu/test
~/test$ sudo -i pwd
/root
~/test$ sudo -E pwd
/home/ubuntu/test
参考