cronが私のスクリプトでsudoジョブを自動的に実行できないのはなぜですか?

cronが私のスクリプトでsudoジョブを自動的に実行できないのはなぜですか?

.を使用する権限がないユーザーのcrontabで実行されるスクリプトがありますが、sudoそうではありません。スクリプトは正常に実行されますが、sudoコマンドは自動的に失敗します。

  • スクリプトは関連ユーザーとしてシェルで完全に実行されます。

  • Sudoにはパスワードは必要ありません。問題のユーザー(root) NOPASSWD: ALLにアクセスできます/etc/sudoers

  • Cronはスクリプトを実行して実行中です。単純なものを追加すると、タイムdate > /tmp/logリーに出力が生成されます。

  • これは権限の問題ではありません。繰り返しますが、スクリプトは実際には実行されますが、sudoコマンドは実行されません。

  • パスの問題ではありません。env実行中のスクリプト内で実行すると、$PATHsudoパスを含む正しい変数が表示されます。フルパスで実行しても役に立ちません。実行されるコマンドにはフルパス名が与えられます。

  • sudoコマンド(STDERRを含む)の出力をキャプチャしようとすると、有用な情報は表示されません。sudo echo test 2>&1 > /tmp/logスクリプトに追加すると、空のログが生成されます。

  • sudo バイナリ自体はうまく実行され、スクリプト内の cron で実行しても権限があることを認識します。sudo -l > /tmp/logスクリプトに追加すると、次の出力が生成されます。

    ユーザー ec2-user は、このホストで次のコマンドを実行できます。
    (root) NOPASSWD: ALL

コマンドの終了コードを確認すると、$?エラー(終了コード:)を返すように見えますが、1エラーは発生しないようです。コマンドは/usr/bin/sudo /bin/echo test同じエラーコードを返すのと同じくらい簡単です。

また何が起こりますか?

これは、最新のAmazon Linux AMIを実行している最近作成された仮想マシンです。 crontab はユーザーに属し、ec2-usersudoers ファイルは配布の基本ファイルです。

ベストアンサー1

sudo権限ファイルにはいくつかの特別なオプションがありますが、そのうちの1つはで実行されるシェルの使用を制限できますが、TTYそうではcronありません。

Amazon Linux AMI を含む一部のディストリビューションでは、デフォルトでこの機能を有効にします。ファイル/etc/sudoersは次のとおりです。

# Disable "ssh hostname sudo <cmd>", because it will show the password in clear.
#         You have to run "ssh -t hostname sudo <cmd>".
#
Defaults    requiretty

#
# Refuse to run if unable to disable echo on the tty. This setting should also be
# changed in order to be able to use sudo without a tty. See requiretty above.
#
Defaults   !visiblepw

STDERRsudoコマンド自体ではなくシェルスクリプトレベルで出力をキャプチャした場合は、次のようなメッセージが表示されます。

申し訳ありません。 sudoを実行するにはttyが必要です。

TTY解決策は、次のオプションを削除またはコメントアウトして、非環境でsudoを実行できるようにすることです。

#Defaults    requiretty
#Defaults   !visiblepw

おすすめ記事