Frage Temporäres Erhöhen des sudo-Zeitlimits für die Dauer eines Installationsskripts


Ich versuche, ein Skript zu schreiben, das eine Reihe von Software installieren wird und ich möchte nicht alles als ausführen müssen root, also würde ich gerne in der Lage sein, nach einem Passwort zu fragen und dann über die Installation zu gehen, mit sudo oder su um Privilegien zu bekommen, wenn ich sie brauche.

Ich machte eine sudo -v um am Anfang des Skripts nach einem Passwort zu fragen und später einfach sudo zu verwenden. Das funktioniert großartig, bis ich zu einer einzigen Installation komme, die die Zeitüberschreitung übernimmt.

Ich möchte die Zeitüberschreitung nicht dauerhaft erhöhen. Gibt es eine Möglichkeit, das sudo-Timeout nur für die aktuelle Sitzung zu erhöhen?


21
2018-05-04 03:42


Ursprung




Antworten:


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

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

#!/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 ... (Hinweis: Die PID wird in die tmp-Datei geschrieben, nur damit Sie sie leicht töten 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)

8
2018-05-04 23:37





Ich mochte Michael_n's Antwort, 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!"

Wiederum, die echo's sind überflüssig ...

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

Auch hier funktioniert ctrl-c ...

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

9
2017-07-02 12:13



Und eine prägnantere Lösung: gist.github.com/3118588 - Gregory Perkins
Wie hat das nicht 1000 upvotes ??? Die prägnante Version ist großartig. (Aber ein besseres Beispiel würde helfen, denke ich.) - MountainX


Basierend auf KernIch habe 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 &

3
2018-06-27 10:41



Ich denke, die wichtigste Version wäre besser, denn wenn sudo -K Wird an anderer Stelle des Shell-Skripts aufgerufen, würde Ihre Version schreien sudo: a password is required stderr jede Minute. - Rockallite
@Rockallite Meinst du meinen verknüpften Kern? Sie sind eigentlich gleich. - Bohr


Laut sudo man seite:

   -v          If given the -v (validate) option, sudo will update the user's time stamp,
               prompting for the user's password if necessary.  This extends the sudo timeout for
               another 15 minutes (or whatever the timeout is set to in sudoers) but does not run
               a command.

Also denke ich, wenn Sie etwas hinzufügen sudo -v In mehr Punkten Ihres Setup-Skripts, um die Sitzung (und nicht nur am Anfang) zu validieren, erhalten Sie, was Sie wollen, da jedes Mal das Zeitlimit erhöht wird (es fragt nur das Passwort erneut, wenn das Timeout erreicht ist). Das einzige Problem besteht darin, dass ein Befehl für Ihr Skript mehr Zeit benötigt als das Zeitlimit (wenn also das Zeitlimit abgelaufen ist, bevor es für eine weitere Validierung abgeschlossen wird), ist dies ein sehr spezifischer Fall.

Was passiert, ist das nur zu verwenden sudo erhöht nicht die Zeitüberschreitung und sudo -v Führt keinen Befehl aus, also müssen Sie verwenden sudo -v öfter, um die Sitzung zu validieren.


0
2018-05-04 05:28



Ja Danke. Das Problem ist, dass mein sudo-Timeout näher bei 5 Minuten liegt, und ich habe einzelne make install-Befehle, die lange darüber hinausgehen. - Arelius
Hmm. Gut. Es gibt nicht viel zu tun, außer die Zeitüberschreitung zu erhöhen. Es gibt keine Möglichkeit, es vorübergehend einzustellen. - coredump


Basis auf der Kern zur Verfügung gestellt von Gregor Perkins und meine Erfahrung, hier ist mein One-Liner:

trap "exit" INT TERM; trap "kill 0" EXIT; sudo -v || exit $?; sleep 1; while true; do sleep 60; sudo -nv; done 2>/dev/null &

Oder

trap "exit" INT TERM
trap "kill 0" EXIT
sudo -v || exit $?
sleep 1
while true; do
    sleep 60
    sudo -nv
done 2>/dev/null &

Erklärungen

  • trap "exit" INT TERM; trap "kill 0" EXIT: Dadurch wird der gesamte Prozessbaum beim Beenden oder SIGINT / SIGTERM gelöscht.

  • sudo -v || exit $?: Fragen Sie nach dem Passwort im Voraus und cachen Sie die Sicherheitsinformationen, aber führen Sie keinen Befehl aus. Wenn das Passwort nicht korrekt ist, beenden Sie es mit dem von sudo zurückgegebenen Code.

  • sleep 1: Verzögerung für ein wenig, so dass Sicherheitsnachweise effektiv gespeichert werden. Wenn das nächste sudo zu früh ausgeführt wird, weiß es das nicht, da die Anmeldeinformationen noch nicht gespeichert wurden. Daher wird nach dem Passwort gefragt.

  • while true; do sleep 60; sudo -nv; done 2>/dev/null &: Aktualisieren Sie die vorhandenen sudo-Sicherheitsanmeldeinformationen wiederholt. Beachten Sie, dass sich diese Version von der des verknüpften Gists unterscheidet: Sie wird ausgeführt sleep 60 zuerst und dann sudo -nv.

    • Das & Betreiber legt das Ganze while Schleife in den Hintergrund und führt es als Kindprozess aus.

    • Das 2>/dev/null leite den stderr des while Schleife zum void, damit Fehlermeldungen, die von Befehlen innerhalb der Schleife generiert werden, verworfen werden.

    • Das -n Option von sudo verhindert, dass der Benutzer zur Eingabe eines Kennworts aufgefordert wird, zeigt jedoch eine Fehlermeldung an und wird beendet, wenn ein Kennwort erforderlich ist.

    • Da ist kein kill -0 "$$" || exit wie im verknüpften Grund, weil die ersten beiden traps wird den Job machen. Es muss nicht 59 Sekunden lang schlafen, bevor es herausfindet, dass der Elternprozess nicht läuft!


0
2018-02-21 10:33