
.を使用する権限がないユーザーの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
答え2
少し遅れてOPはもはや興味がないかもしれませんが、sudo
これを使用している他の人のためのuser crontab
潜在的な解決策は次のとおりです。
sudo
aで使用しないで、代わりに以下を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 crontab
sudo crontab -e
0 12 * * * /usr/bin/printenv > /home/user_me/cronenvironment_sudo.txt 2>&1
user_me
システムの実際のユーザー名に変更し、次を参照してください。クローンタップマスタースケジュールの助けを借りてください。
最後に、このQ&Aを参照して方法を学びます。環境を変えるcron
。