sudo資格情報タイムスタンプタイムアウトを一時的に無効にする方法は?

sudo資格情報タイムスタンプタイムアウトを一時的に無効にする方法は?

次のbashスクリプトがあるとしましょう。

#!/bin/bash
sudo command1
command2
sudo command3

command2私はrootとして実行したくないのでsudosudo command1残念ながら、command2完了するのに約2時間かかります。したがって、sudo資格情報のタイムスタンプがタイムアウトしてスクリプトが到着すると、sudo command3パスワードを再入力するように求められます。

で説明されているように、sudo資格情報のタイムスタンプタイムアウトを完全に無効にしたくありません。https://superuser.com/a/149740例えば。タイムアウトを一時的に無効にして、このbashセッションが終了するまでそのセッションの資格情報を効果的に維持したいと思います。

答え1

sudo最善の選択肢は、sudoタイムスタンプを更新し、権限が不要になったときに終了する(バックグラウンド)忙しい待機ループだと思います。以下は、sleep 6two hourの代わりに実行され、代わりに表示されるコマンドをcommand2実行するサンプルスクリプトです。/bin/echocommand1command2

#!/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 59sudoersの既存の設定に基づいてフレーバーを調整しますtimestamp_timeout。タイムスタンプのタイムアウトが60秒の場合、選択できる方法を示すために59を選択しました。

答え2

解決策が非常に明確に見えるので、ここで何かを見逃しているようです。

command2rootで実行したくないのでsudo

ただし、スクリプトを変更すると、sudoroot で実行しなくてもスクリプト全体を実行できます。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」を明示的に使用する目的は何ですか?

  1. ユーザーのパスワードを読み、環境変数に保存します。
  2. sudo資格情報を無視するには、フラグを使用して実行すると-k常にパスワードの入力を求められます。
  3. フラグを介してstdinパスワードを渡します。sudo-S
  4. パスワード環境変数の削除

場合によっては便利ですが、ユーザーのパスワードを環境変数に保存するのが良いアイデアであるかどうかはわかりません。

関連情報