yunomuのブログ

酒とゲームと上から目線

sudoの時のPATH

sudoでコマンド実行しようとしたらcommand not foundになる。
sudo -iなら動きはするんだけど、カレントディレクトリが~rootになるのがあまり面白くない。

sudoの環境変数ってどこから読まれるんだろう……という話。

最初はrootとかそのユーザの環境変数が読まれるのかと思ってたけども、そうではないっぽい。というかそのためのsudo -iですし、セキュリティ的にも制限しておいた方がいいのかもしれないしね。
その辺の設定はsudoersにありました。

env_keepって値で指定した環境変数は、sudoを実行した元の環境から引き継がれるらしい。
なんかこういうの。

Defaults    env_keep =  "COLORS DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS"
Defaults    env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE"
Defaults    env_keep += "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES"
Defaults    env_keep += "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE"
Defaults    env_keep += "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"

これに以下を追加してあげればいいんじゃないでしょうか。

Defaults    env_keep += "PATH"

と思ったけどこれではうまくいかなかった。

もうちょいよく見るとこういうのがあった。

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin

これじゃないか?

% sudo env
(略)
PATH=/sbin:/bin:/usr/sbin:/usr/bin
(略)

これじゃないか。

信頼出来るパスならsecure_pathに書いてあげるといいらしいです。

詳しくはsudoers(5)で。