権限のないユーザーの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ファイルが配布のデフォルトです。
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