Syntax Error.

[Sy] cronでsudoが必要なコマンドを実行しようとしたらTTYないとダメだよとエラーになる場合の設定方法

2016/04/09

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とユーザ名が入ってることになります)