💭

sudo のときに $PWD がそのままであってほしい

2021/03/26に公開

問題

sudo すると環境変数は /etc/sudoers に書かれた設定にしたがうので、カレントディレクトリを表す環境変数 $PWD は通常はリセットされて空文字列になってしまう。

$PWD は大抵はデフォルトで設定されていて、カレントディレクトリを指し、Makefile でいろいろな処理を書くときに重宝するので、sudo 時にも保存されていてほしい。

解決法

sudo 実行前の環境変数から引き継がれるのは /etc/sudoers の中に Defaults env_keep で指定する。Defaults は他にこんなものが書かれている。意味はよくわからないが、この辺に追加すればよさそうである。

Defaults	env_reset
Defaults	mail_badpass
Defaults	secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"

しかし /etc/sudoers には「このファイルは visudo を使ってしか編集しちゃダメだよ!代わりに /etc/sudoers.d の中は勝手にいじっていいから!」的なコメントが書いてあるので、そうさせてもらう。/etc/sudoers.d/README に「このフォルダに追加するファイルの権限は 0440 でお願いね!」って書いてあるので大人しく従う。

$ cd /etc/sudoers.d
$ touch my_setting
/etc/sudoers.d/my_setting
Defaults	env_keep+="PWD"
$ chmod 0440 my_setting

これで OK。

Ansible でやる

以下のタスクを実行させればよい。

---
- name: "add ansible config in /etc/sudoers.d"
  lineinfile:
    create: yes
    dest: /etc/sudoers.d/ansible
    line: "Defaults\tenv_keep+=\"PWD\""
    mode: 0440

Discussion