要注意事項
/etc/sudoers の設定を間違えると、最悪 sudo が使えなくなる。
sudo が使えなくなると、/etc/sudoers 自体を編集することもできなくなり、詰んでしまう。
GRUB が起動できるなら最悪復旧することもできるが、GRUB が使えない環境、たとえば Raspberry Pi などでは完全に詰んでしまうので、十二分に気をつけること。
ちなみに完全に詰んでしまったら OS を再インストールするしかない。
クイックセットアップガイド
sudo visudo
- Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
+ #Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
+ Defaults env_keep +="PATH"
sudo -E mycommand
command not found の回避
~/.bashrc や ~/.zshrc でパスを通しても、sudo をつけると command not found になることがある。
これを解決するには、/etc/sudoers という設定ファイルを編集する必要がある。
ただし、このファイルは設定を間違えると取り返しのつかないことになる非常にナイーブなファイルなので、通常の方法では編集することができない。
たとえば sudo vi /etc/sudoers を実行しても read only となり編集することができない。
このファイルを編集するには、以下のコマンドを実行する。
sudo visudo
#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults env_reset
Defaults mail_badpass
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
# Host alias specification
# User alias specification
# Cmnd alias specification
# User privilege specification
root ALL=(ALL:ALL) ALL
# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL
# Allow members of group sudo to execute any command
%sudo ALL=(ALL:ALL) ALL
# See sudoers(5) for more information on "#include" directives:
# includedir /etc/sudoers.d
このファイルを、以下のように変更する。
- Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
+ #Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
+ Defaults env_keep +="PATH"
secure_path をコメントアウトして、env_keep を追加する。secure_path は削除しても良いが、怖いのでとりあえずコメントアウトにしておく。
これで command not found は解消される。
環境変数がセットされない問題の回避
次に、環境変数についてだが、sudo でコマンドを実行すると、一般ユーザで使えていた環境変数の大半が使えなくなる。
その理由は、先の /etc/sudoers に env_reset が追加されているからだ。
env_reset を設定すると、sudo 実行時に必要最低限の環境変数しか読み込まれなくなる。
ただ、ときどき環境変数が sudo では使えなくて不便に感じることがある。
そのときは、以下の例のように、sudo のオプション -E を使うことでこの問題を回避できる。
sudo -E mycommand
env_reset によって環境変数がリセットされているので、この行を消せば毎回 -E を指定しなくて済むのだが、それはいろいろと問題があるので、環境変数が必要なときのみ -E をつけることをおすすめする。