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)で。

atコマンド

atコマンドの使い方。たまにしか使わないので忘れがちですよね。

% at 10:00
at> service tomcat restart
at>^D
job 1 at 2012-04-24 10:00

既に過ぎた時刻を指定すると翌日になる。

こんなでもいい。

% at 10am tomorrow

詳しくはat(1)

確認と削除。

% atq
job 1 at 2012-04-24 10:00
% atrm 1
% atq

実態はcron。

% ls /var/spool/at
a0000101539318 spool/

この"a****"が指定した時刻に実行される。