web-dev-qa-db-ja.com

スクリプトでcronがSudoの実行を黙って失敗するのはなぜですか?

権限のないユーザーのcrontabからスクリプトを実行して、Sudoを使用していくつかのコマンドを呼び出します。それを除いて。スクリプトは正常に実行されますが、Sudoで実行されたコマンドは通知なしで失敗します。

  • スクリプトは、問題のユーザーとしてシェルから完全に実行されます。

  • Sudoはパスワードを必要としません。問題のユーザーは(root) NOPASSWD: ALL/etc/sudoersアクセスが許可されています。

  • Cronはスクリプトを実行して実行しています。単純なdate > /tmp/logを追加すると、適切なタイミングで出力が生成されます。

  • 権限の問題ではありません。この場合も、スクリプトは実行されますが、Sudoされたコマンドだけではありません。

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

  • STDERRを含むSudoコマンドの出力をキャプチャしようとしても、有用なものは何も表示されません。スクリプトに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-userに属し、sudoersファイルが配布のデフォルトです。

31
Caleb

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

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

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

解決策は、これらのオプションを削除するかコメント化することにより、Tudo以外の環境でSudoを実行できるようにすることです。

#Defaults    requiretty
#Defaults   !visiblepw
41
Caleb