0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

sudo コマンドを使うときの環境変数の挙動

Last updated at Posted at 2024-09-22

目的

sudo コマンドを使うときは、オプションによって、環境変数が引き継がれたり引き継がれなかったりするので、重要な事項を抑える。

環境

EC2 ubuntu

具体例

sudo の環境変数は ubuntu ユーザの環境変数とは異なる。
sudo の環境変数は主に /etc/sudoers に定義され、PATH環境変数は /etc/environment に定義されている。
sudo -iroot としてログインし直すので、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/sudoersDefaults 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 -iroot としてログインし直すので、実行ディレクトリは下記のように /rootとなっていることにも注意されたい。

~/test$ pwd
/home/ubuntu/test
~/test$ sudo pwd
/home/ubuntu/test
~/test$ sudo -i pwd
/root
~/test$ sudo -E pwd
/home/ubuntu/test

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?