目的
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
参考