スクリプトの実行中にsudoが期限切れにならないようにする方法[重複]

Dec 22 2020

一度に何時間もスクリプトを実行する必要がある場合がありますが、その間に一部のコマンドが必要になりsudoます。ただし、sudo定期的にパスワードを確認して再入力しないと、sudo: timed out reading passwordエラーが発生し、全体が壊れることがあります。sudo myscript.sh一部のコマンドは。なし で実行する必要があるため、使用したくありませんsudo

sudoキャッシュされたパスワードを、システムの残りの部分を変更せずに、スクリプトの全期間にわたってスクリプトに対して保持したい(この1つのスクリプトに対してのみsudo永続化する)。

sudoスクリプトの全期間にわたって、1つのスクリプトだけを長持ちさせる方法はありますか?

回答

KamilMaciorowski Dec 22 2020 at 13:53

可能性:でスクリプトを実行しますsudo myscript.sh。スクリプト内では、sudoこの方法なしで実行する必要があるコマンドを実行します。

sudo -u "$SUDO_USER" foo args

(スクリプト全体がなしで実行される場合に備えて、適切なロジックを使用している可能性がありますsudo)。rootユーザーはsudo、を認証する必要がないため、別のユーザーとしてコマンドを実行するためにパスワードを入力する必要はありません。

スクリプトの大きさ(スクリプトを変更する必要がある量)と、全体を実行することについてどのように感じているsudoかによって、アイデアが好きか嫌いかがあります。現在のアプローチでは、昇格されていないコードがデフォルトであり、sudo明示的な例外がある行です。私のアプローチはこれを逆さまにします。スクリプトを作成およびテストするときは、さらに注意する必要があります。これはベストプラクティスではないことを認めます。それでも、期限切れの問題は解決しますsudo

個人的には、このソリューションは、それほど複雑ではない(単純なループ、いくつかのコマンド)長時間実行されるスクリプトに使用します。ただし、複雑なスクリプトを再構築する前に、よく考えます。


もう1つのアプローチは、キャ​​ッシュされた資格情報をバックグラウンドで定期的に更新することです。デフォルトでは、これらはttyごとです(を参照tty_tickets)。このように進めます:

sudo -v                              # to enter your password once
while sleep 300; do sudo -v; done &  # adjust the interval if needed
myscript.sh

不要になったときにバックグラウンドジョブを強制終了することを忘れないでください。スクリプト自体がそのようなジョブを開始できます。次に、スクリプトの終了時にジョブを自動的に強制終了するために、スクリプト内のいくつかのトラップが必要になる可能性があります。