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

答え2

少し遅れてOPはもはや興味がないかもしれませんが、sudoこれを使用している他の人のためのuser crontab潜在的な解決策は次のとおりです。

sudoaで使用しないで、代わりに以下をuser crontab使用してくださいroot crontab

$ sudo crontab -e

存在する一部システムはsudo設定方法によってsudo実際にuser crontab使用されます(例:Raspberry Pi OS)。ただし、 を使用するとroot crontabより移植性の高い方法なので、sudoコマンドやスクリプトを実行するために を使用する必要もありません。したがって、sudo mount 'blah, blah'で使用するとにuser crontabなります。mount 'blah, blah'root crontab

作業環境がどの環境で実行されているかわからない場合は、cron()に次の項目を追加してcronそれを知らせるように依頼できます。root crontabsudo crontab -e

0 12 * * * /usr/bin/printenv > /home/user_me/cronenvironment_sudo.txt 2>&1

user_meシステムの実際のユーザー名に変更し、次を参照してください。クローンタップマスタースケジュールの助けを借りてください。

最後に、このQ&Aを参照して方法を学びます。環境を変えるcron

関連情報