プログラミングや低レイヤで遊ぶ人

基本的には遊んだことを記事にしていく

cron で sudo がしたい

 

2020-10-8 @jumdtw
研究用でサーバーに色々なことを定期実行させるために cron を使っていたが sudo をしてくれなかった。 なので visudo をつかって cron でも sudo を使えるようにした。
01cron とは
UNIX 系の OS にはいっていてプログラムを定期実行しれくれるもの。crontab コマンドを使って設定とかをする。以下みたいな設定ファイルを書いて時間を指定する。ここでは、cron 自体の説明はあまりしないので悪しからず。
# 分 時 日 月 曜日 <CMD0>
30 3 * * * <CMD1>
0 5 * * * <CMD2>
ちなみに、指定した時間に PC の電源が切れていた場合は実行されず、その後に電源がついても指定した時間にならなければ実行はされない
02sudo があると実行されない問題
仮に以下のような設定をしたとする。
# 分 時 日 月 曜日 <CMD0>
n h * * * ~/hoge.sh
そんでもって hoge.sh の中身が以下のような感じ。
sudo touch fuga
別に実行するコマンドはなんでもいいのだが、とりあえず一例として touch コマンドとした。なぜかこれがデフォルトでは動かない。
03解決方法(やめたほうがいい)
とにかく解決したかった私はあまりいい方法ではない visudo コマンドを使用して、特定のコマンドを sudo を使用して実行したときにパスワードを必要としないように設定した。
user ALL=NOPASSWD: touch
やばみ。絶対やめたほうがいい。これをやると一部コマンドが root 権限でできてしまうのでとても危険。
03解決方法・改
じゃあどうするのかということだが、sudo を使用するようなものは root に実行させればいい。
root権限に以降
$ sudo su
root権限でcronを使用したことない場合は以下コマンドで設定ファイルを作る
# crontab -u root -e
記述した設定ファイルを読み込ませる
# crontab cron.conf
cron.confと使用するスクリプトは以下のような感じ。root 権限で行うため sudo は必要なくなる。また、先ほどの例では相対パスで書いていたが、root になるとホームディレクトリも変わるので基本的には絶対パスで書いた方がいい。
cron.conf

n h dom mon dow /home/user/test.sh
test.sh

sudo touch fuga
私の環境ではこれで sudo を必要とするスクリプト・コマンドを cron で動かすことができた。ちなみに、 cron はデフォルトではログをはかないので以下のように /etc/rsyslog.d/50-default.conf を書き換えないといけない。
/etc/rsyslog.d/50-default.conf

以下をコメントから除外
cron.* /var/log/cron.log
これで /var/log/cron.log としてログが出る。でも、どうやら cron で設定したスクリプト・コマンドをリダイレクトしてそれぞれのログを生成した方がいいらしい?