[Sy] cronでsudoが必要なコマンドを実行しようとしたらTTYないとダメだよとエラーになる場合の設定方法
cronでsudoが必要なコマンドを実行しようとしたら sudo: sorry, you must have a tty to run sudo
とエラーになってしまう場合の対処です。
cronでsudoが使えない
cronで設定しているコマンドがうまく実行されていないようだったので、メールで送られてきている実行結果を見てみました。
$ less /var/spool/mail/[user_name]
メールのエラーメッセージには、
sudo: sorry, you must have a tty to run sudo
とありました。TTYないとsudo使えないよ。ごめんね。 だそうです。
解決方法
visudo
で/etc/sudoers
をちょっといじります。
$ sudo visudo
Defaults requiretty
という設定を探します。
・
・
# Disable "ssh hostname sudo <cmd>", because it will show the password in clear.
# You have to run "ssh -t hostname sudo <cmd>".
#
Defaults requiretty
・
・
ここを、
# Defaults requiretty ← コメントアウト
Defaults:utano320 !requiretty ← 追加
というように、cronでコマンドを実行するユーザ名(utano320
の部分)を使って書き換えます。
これによって、元々 sudo使うときはTTY必須 だったのが、utano320はTTY不要 というように設定を変えたことになります。
修正したら保存して終わりです。
もうすこし詳しく
TTYについて
TTYについてよく知らなかったので、ちょっと調べました。次の記事が参考になりました。
⇒ ttyについて ttyやptsってなんぞ? - それマグで!要するに、SSHとかで端末から扱う場合はTTYあり(TTY経由?)での操作ということ解釈でいいのではないかと。
すべてのユーザに対してTTY不要とする設定方法もあるけど・・・
実は今回の解決方法にたどり着く前に、
# Defaults requiretty ← コメントアウト
と、元々の設定をコメントアウトするだけ(先ほどの場合と違って特定のユーザに対しての設定は追加しない)でOKという方法を見つけ、それでもうまくいくことを確認してました。
が、以下の記事を読んでみると、
⇒ cronの中でsudo を使う方法 - yuumi3のお仕事日記デフォルトでtty(コンソール)と繋がってないsudoを実行出来ないようにしているのはクラッキング目的で進入したソフト等からsudoされないようにする為です。 なので無闇にこれを無効にしてしまうのは望ましくありません。
ということを知ったので、特定のユーザのみ許可するという方法に変えました。
cronの実行ユーザの確認
これは、「やっぱりそうだよね」という感じですが、念のためcronの実行ユーザを知りたいなーと思ったので、cronのログ(/var/log/cron
)を見てみると、
Apr 9 21:50:01 host CROND[3331]: ([user_name]) CMD ([command])
のように[user_name]
の部分にcronを実行したユーザ名が入ってました。(上記の設定例だと、ここにutano320
とユーザ名が入ってることになります)