次のbashスクリプトがあるとしましょう。
#!/bin/bash
sudo command1
command2
sudo command3
command2
私はrootとして実行したくないのでsudo
。sudo command1
残念ながら、command2
完了するのに約2時間かかります。したがって、sudo資格情報のタイムスタンプがタイムアウトしてスクリプトが到着すると、sudo command3
パスワードを再入力するように求められます。
で説明されているように、sudo資格情報のタイムスタンプタイムアウトを完全に無効にしたくありません。https://superuser.com/a/149740例えば。タイムアウトを一時的に無効にして、このbashセッションが終了するまでそのセッションの資格情報を効果的に維持したいと思います。
答え1
sudo
最善の選択肢は、sudoタイムスタンプを更新し、権限が不要になったときに終了する(バックグラウンド)忙しい待機ループだと思います。以下は、sleep 6
two hourの代わりに実行され、代わりに表示されるコマンドをcommand2
実行するサンプルスクリプトです。/bin/echo
command1
command2
#!/bin/sh
sudo /bin/echo command 1
while :; do sudo -v; sleep 1; done &
infiloop=$!
sleep 6
sudo /bin/echo command 3
kill "$infiloop"
実際のスクリプトでは、より快適なループを使用することをお勧めします。
#!/bin/sh
sudo command1
while :; do sudo -v; sleep 59; done &
infiloop=$!
command2
sudo command3
kill "$infiloop"
sleep 59
sudoersの既存の設定に基づいてフレーバーを調整しますtimestamp_timeout
。タイムスタンプのタイムアウトが60秒の場合、選択できる方法を示すために59を選択しました。
答え2
解決策が非常に明確に見えるので、ここで何かを見逃しているようです。
command2
rootで実行したくないのでsudo
。
ただし、スクリプトを変更すると、sudo
root で実行しなくてもスクリプト全体を実行できます。command 2
#!/bin/bash
command1
sudo -u ${SUDO_USER:-$USER} command2
command3
答え3
渡すさわやかさバックエンド資格情報:
#!/bin/bash
configurePermissions () {
sudo -v
refreshPermissions "$$" &
}
refreshPermissions () {
local pid="${1}"
while kill -0 "${pid}" 2> /dev/null; do
sudo -v
sleep 10
done
}
configurePermissions
答え4
まあ、合わされるかもしれないコマンドを実行した後、sudoが自動的にパスワードを忘れてしまう方法は?そして「sudo-S」を明示的に使用する目的は何ですか?
- ユーザーのパスワードを読み、環境変数に保存します。
sudo
資格情報を無視するには、フラグを使用して実行すると-k
常にパスワードの入力を求められます。- フラグを介して
stdin
パスワードを渡します。sudo
-S
- パスワード環境変数の削除
場合によっては便利ですが、ユーザーのパスワードを環境変数に保存するのが良いアイデアであるかどうかはわかりません。