GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Temporäres Erhöhen des Timeouts von sudo für die Dauer eines Installationsskripts

Lösung 1:

Sie können eine Schleife einrichten, die im Hintergrund ausgeführt wird, um regelmäßig "sudo -v" auszuführen. Der Trick besteht natürlich darin, die Schleife sauber zu beenden, wenn Ihr Skript beendet wird. Es muss also eine Art Kommunikation zwischen den beiden Prozessen geben; tmp-Dateien sind dafür in Ordnung und können auch nach dem Ausführen des Skripts leicht bereinigt werden. (Ein Installationsskript erledigt dies normalerweise ohnehin.)

Zum Beispiel (entfernen Sie die 'echo'-Anweisungen, um dies zu verwenden; diese zeigen nur, dass es "funktioniert"):

#!/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

Dann werden Sie sehen... (Anmerkung:die PID wird in die tmp-Datei geschrieben, nur damit Sie sie einfach beenden können. Es ist jedoch nicht notwendig):

$ ./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)

Lösung 2:

Ich mochte die Antwort von michael_n, hatte aber den irrationalsten Wunsch, keine temporäre Datei zu verwenden. Vielleicht kann dies eine Perspektive bieten.

Meine Lösung war:

#!/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!"

Wieder der echo 's sind fremd...

$ ./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

Nochmals, Strg-C funktioniert auch...

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

Lösung 3:

Basierend auf diesem Kern habe ich eine prägnante und saubere Version erstellt:

# 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. Der Zweck des Schlüsselworts „do“ in Bash-For-Schleifen?

  2. Bash Echo Die Befehlszeile wird in der Befehlszeile selbst ausgeführt (nicht in einem Skript)?

  3. Die Aktion Installation für das Produkt MySQL Server 5.7.19 ist fehlgeschlagen.

  4. Installieren Sie Qt unter Ubuntu

  5. Ist das pdftotext-Befehlszeilentool für Mac?

Das vollständige Handbuch zur Verwendung von ffmpeg unter Linux

Gnome 3.2 Probleme in der Shell?

Erhöhen Sie den Swap-Speicherplatz auf Ubuntu?

So installieren Sie Cockpit auf Ubuntu 22.04 für eine bessere Serververwaltung

So installieren Sie den MongoDB GUI Adminer auf AlmaLinux

Was ist der schnellste Weg, um ein Skript auszuführen?