【Ubuntu】cronでsudoを実行するにはどうすれば。

指定したタイミングでコマンドを自動実行してくれる cron 。sudo を含むコマンドを cron で実行するのには、少し工夫が必要です。

一般ユーザとして、sudo を含む crontab を設定してみます。まずは、

# crontab -e

でエディタを起動して、中身を以下のように記述、保存。

# いちおう使用するシェルとパスを設定。
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# 毎日、午前3時に実行。エラー出力を自分のホームディレクトリに書き出し。
0 3 * * * sudo なにがしかのコマンド 2>>/home/自分のユーザ名/cron_error

さて、指定した時刻が来て cron が実行された後にエラー出力ファイル・cron_error を覗いてみると

sudo: 端末 (tty) が存在せず、パスワードを尋ねる (askpass) プログラムが指定されていません

…と、こんなのが出力されています。端末なし・パスワード無しだと "sudo" が正常に実行されないようですな。セキュリティの都合でこういう設定になっています。

さあ、cron で sudo を含むコマンドを自動実行するにはどうしたら良い?

ネットを検索すると、よく「/etc/sudoers を編集して、端末(TTY)なし・パスワード無しで sudo を実行できるようにする」 という方法が紹介されています。

このような設定をするよりも「sudo su で root になって、root の crontab にジョブを登録」するほうが安全確実簡単ではなかろうか。

「cron で sudo が必要なコマンドを実行したい」と思っているということは、あなたのアカウントは sudoer な訳です。つまり、コマンドラインで直接 sudo を実行することはできますね。ということは、

# sudo su

で root になれます。通常は。

root になれたら、

# crontab -e

で、root ユーザーの crontab ファイルを編集してジョブを登録してみましょ。内容は例えば、

# いちおう使用するシェルとパスを設定。
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

# 毎日、午前3時に実行。
0 3 * * * なにがしかのコマンド

root の crontab は root 権限で動作するので、登録するコマンドフィールドに sudo は必要ありません。

無闇に一般ユーザの権限を拡張するよりも、セキュリティの面から見てもこのほうが良くないですか? システム管理に関わる作業は管理者 の crontab に、ユーザ個人の作業はユーザの crontab で…というふうに分けておいたほうがすっきりするし。

もうひとつ、別の方法。

主にシステムサービスなどが利用する crontab ファイルは、以下の場所にあります。

/etc/crontab
あるいは…
/etc/cron.d/ファイル名
などなど…

ここら辺にある crontab ファイルを試しに開いて見てみればわかりますが、ユーザーベースの crontab と書式は殆ど同じです。ただ、このシステムワイドな crontab の場合、コマンドの実行ユーザ名を指定できるフィールドがあります。

ということは…。

# いちおう使用するシェルとパスを設定。
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

#分 時 月 日 曜日 ユーザ名 コマンド
0 3 * * * root なにがしかのコマンド

みたいな crontab ファイルを作って、ディレクトリ /etc/cron.d/ の下に適当な名前で置いてやれば良いですね。上記の方法と同様な動作をする筈です。

ちなみに、こういうことはすぐ忘れてしまうのでメモメモ。

ユーザごとの cron 設定ファイル(コマンド crontab -e で編集できるやつ)の保存場所。

/var/spool/cron/crontabs/ユーザ名

ここにあります。

crontab をバックアップしたい…などのときは、ここを覗けばOKです。

カテゴリ: