.を使用する権限がないユーザーのcrontabで実行されるスクリプトがありますが、sudo
そうではありません。スクリプトは正常に実行されますが、sudoコマンドは自動的に失敗します。
スクリプトは関連ユーザーとしてシェルで完全に実行されます。
Sudoにはパスワードは必要ありません。問題のユーザー
(root) NOPASSWD: ALL
にアクセスできます/etc/sudoers
。Cronはスクリプトを実行して実行中です。単純なものを追加すると、タイム
date > /tmp/log
リーに出力が生成されます。これは権限の問題ではありません。繰り返しますが、スクリプトは実際には実行されますが、sudoコマンドは実行されません。
パスの問題ではありません。
env
実行中のスクリプト内で実行すると、$PATH
sudoパスを含む正しい変数が表示されます。フルパスで実行しても役に立ちません。実行されるコマンドにはフルパス名が与えられます。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-user
sudoers ファイルは配布の基本ファイルです。
ベストアンサー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
STDERR
sudoコマンド自体ではなくシェルスクリプトレベルで出力をキャプチャした場合は、次のようなメッセージが表示されます。
申し訳ありません。 sudoを実行するにはttyが必要です。
TTY
解決策は、次のオプションを削除またはコメントアウトして、非環境でsudoを実行できるようにすることです。
#Defaults requiretty
#Defaults !visiblepw