GNU/Linux >> Linux の 問題 >  >> Linux

インストール スクリプトの実行中に sudo のタイムアウトを一時的に増やす

解決策 1:

バックグラウンドで実行されるループをセットアップして定期的に「sudo -v」を実行することができます。もちろん、トリックは、スクリプトが終了したときにループをきれいに終了させることです。そのため、2 つのプロセス間に何らかの通信が必要です。 tmp ファイルはこれに適していて、スクリプトの実行後に簡単にクリーンアップすることもできます。 (いずれにせよ、通常はインストール スクリプトがこれを行います。)

例 (これを使用するには、'echo' ステートメントを削除します。これらは単に「動作中」であることを示しています):

#!/bin/bash
log=running_setup.txt
sudo_stat=sudo_status.txt

echo "========= running script $$ ========"
echo $$ >> $sudo_stat
trap 'rm -f $sudo_stat >/dev/null 2>&1' 0
trap "exit 2" 1 2 3 15

sudo_me() {
 while [ -f $sudo_stat ]; do
  echo "checking $$ ...$(date)"
  sudo -v
  sleep 5
 done &
}


echo "=setting up sudo heartbeat="
sudo -v
sudo_me

echo "=running setup=" | tee $log
while [ -f $log ]
do
 echo "running setup $$ ...$(date) ===" | tee -a $log
 sleep 2
done

# finish sudo loop
rm $sudo_stat

次に表示されます... (注:pid は tmp ファイルに入れられます。これは、簡単に削除できるようにするためです。ただし、必要ではありません):

$ ./do_it.sh
========= running script 6776 ========
=setting up sudo heartbeat=
[sudo] password for user: 
=running setup=
checking 6776 ...Wed May  4 16:31:47 PDT 2011
running setup 6776 ...Wed May  4 16:31:48 PDT 2011 ===
running setup 6776 ...Wed May  4 16:31:50 PDT 2011 ===
running setup 6776 ...Wed May  4 16:31:52 PDT 2011 ===
checking 6776 ...Wed May  4 16:31:53 PDT 2011
running setup 6776 ...Wed May  4 16:31:54 PDT 2011 ===
<ctrl-c>  (cleans up files, then exits)

解決策 2:

私は michael_n の答えが好きでしたが、一時ファイルを使用したくないという最も不合理な欲求がありました。たぶん、これはいくつかの視点を提供することができます.

私の解決策は次のとおりです。

#!/bin/bash
function sudo_ping() {
    if [[ ! -z $SUDO_PID ]]; then
        if [[ $1 -eq stop ]]; then
            echo "Stopping sudo ping in PID = $SUDO_PID"
            kill $SUDO_PID
            return
        else
            echo "Already sudo pinging in PID = $SUDO_PID"
            return
        fi
    fi

    echo "Starting background sudo ping..."
    sudo -v
    if [[ $? -eq 1 ]]; then
        echo "Oops, wrong password."
        return
    fi
    sudo echo "ok"

    while true; do
        echo 'Sudo ping!'
        sudo -v
        sleep 1
    done &
    SUDO_PID=$!
    sudo echo "Sudo pinging in PID = $SUDO_PID"

    # Make sure we don't orphan our pinger
    trap "sudo_ping stop" 0
    trap "exit 2" 1 2 3 15
}

sudo_ping
sleep 5
echo "Goodbye!"

繰り返しますが、echo は無関係です...

$ ./sudoping.sh 
Starting background sudo ping...
Password:
ok  
Sudo ping!
Sudo pinging in PID = 47531
Sudo ping!
Sudo ping!
Sudo ping!
Sudo ping!
Goodbye!
Stopping sudo ping in PID = 47531

繰り返しますが、ctrl-c も機能します...

$ ./sudoping.sh 
Starting background sudo ping...
ok  
Sudo ping!
Sudo pinging in PID = 47599
Sudo ping!
^CStopping sudo ping in PID = 47599

解決策 3:

この要点に基づいて、簡潔でクリーンなバージョンを作成しました:

# Prevent sudo timeout
sudo -v # ask for sudo password up-front
while true; do
  # Update user's timestamp without running a command
  sudo -nv; sleep 1m
  # Exit when the parent process is not running any more. In fact this loop
  # would be killed anyway after being an orphan(when the parent process
  # exits). But this ensures that and probably exit sooner.
  kill -0 $$ 2>/dev/null || exit
done &

Linux
  1. sudoにパスワードを長く覚えさせる方法

  2. Bash For Loopsの「do」キーワードの目的は?

  3. Bash Echoコマンドライン自体で実行されるコマンドライン(スクリプトではない)?

  1. アクションMySQLServer5.7.19のインストールが失敗しました。

  2. UbuntuオペレーティングシステムにIMAPforPHP7.1をインストールします

  3. Mac 用の pdftotext コマンド ライン ツールはありますか?

  1. パフォーマンスと安定性のためのApache2Buddyスクリプトの使用

  2. スクリプト内の bash シェル スクリプトおよび関数の変数スコープ

  3. Mac 用の Linux の updatedb コマンドに相当するものは何ですか?