So lassen Sie sudo nicht ablaufen, während das Skript ausgeführt wird [duplizieren]

Dec 22 2020

Manchmal muss ich stundenlang ein Skript ausführen, in dem einige Befehle erforderlich sind sudo. Wenn ich das sudoPasswort jedoch nicht regelmäßig überprüfe und erneut eingebe , wird der sudo: timed out reading passwordFehler angezeigt , der manchmal das Ganze beschädigt . Ich möchte nicht verwenden, sudo myscript.shda einige der Befehle ohne ausgeführt werden sollten sudo .

Ich möchte, dass das sudozwischengespeicherte Kennwort für das Skript für die gesamte Dauer des Skripts erhalten bleibt, ohne den Rest des Systems zu ändern ( sudoPersistenz nur für dieses 1 Skript).

Gibt es eine Möglichkeit, sudofür die gesamte Dauer des Skripts und nur für das 1-Skript das Letzte zu machen ?

Antworten

KamilMaciorowski Dec 22 2020 at 13:53

Möglichkeit: Führen Sie das Skript mit aus sudo myscript.sh. Führen Sie im Skript Befehle aus, die ohne sudodiese Methode ausgeführt werden sollten:

sudo -u "$SUDO_USER" foo args

(Vielleicht mit der richtigen Logik, falls das gesamte Skript jemals ohne ausgeführt wird sudo). Der Root-Benutzer muss sich nicht authentifizieren sudound muss daher kein Kennwort eingeben, um einen Befehl als anderer Benutzer auszuführen .

Abhängig davon, wie groß das Skript ist (wie viel Sie ändern müssen) und wie Sie das Ganze mit sudoIhnen ausführen möchten, gefällt Ihnen die Idee möglicherweise oder nicht. In Ihrem aktuellen Ansatz ist nicht erhöhter Code die Standardeinstellung, wobei Zeilen sudoexplizite Ausnahmen darstellen. Mein Ansatz stellt dies auf den Kopf. Sie müssen beim Erstellen und Testen des Skripts vorsichtiger sein. Ich gebe zu, dass dies nicht die beste Vorgehensweise ist. dennoch löst es das Problem des Ablaufens sudo.

Persönlich würde ich diese Lösung für ein lang laufendes Skript verwenden, das nicht zu kompliziert ist (einfache Schleife, wenige Befehle). Ich würde es mir zweimal überlegen, bevor ich ein kompliziertes Skript neu erstelle.


Ein anderer Ansatz besteht darin, die zwischengespeicherten Anmeldeinformationen im Hintergrund regelmäßig zu aktualisieren. Standardmäßig sind dies pro tty (siehe tty_tickets). Gehen Sie wie folgt vor:

sudo -v                              # to enter your password once
while sleep 300; do sudo -v; done &  # adjust the interval if needed
myscript.sh

Vergessen Sie nicht, den Hintergrundjob zu beenden, wenn er nicht mehr benötigt wird. Das Skript selbst kann einen solchen Job starten. Dann möchten Sie wahrscheinlich, dass einige Traps im Skript den Job automatisch beenden, wenn das Skript beendet wird.