Ich möchte ein automatisiertes Nachinstallationsskript in Bash schreiben ( post-install.sh
wird zum Beispiel aufgerufen ). Das Skript fügt automatisch Repositorys hinzu und aktualisiert sie, installiert und aktualisiert Pakete, bearbeitet Konfigurationsdateien usw.
Wenn ich dieses Skript jetzt beispielsweise mit ausführe sudo post-install.sh
, werde ich nur sudo
einmal zur Eingabe eines Kennworts aufgefordert , oder muss ich das sudo
Kennwort bei jedem Aufruf eines Befehls innerhalb des Skripts eingeben, für den eine sudo
Berechtigung erforderlich ist ? Mit anderen Worten, übernehmen die Befehle im Bash-Skript sozusagen die Ausführungsberechtigungen?
Und wenn sie tatsächlich tun , ist es noch eine Möglichkeit , dass die sudo
Berechtigungen Timeout (wenn zum Beispiel ein bestimmte Befehl lange genug dauert , die überschreiten sudo
Timeout)? Oder wird der anfängliche sudo
Passwort Eintritt für die gesamte Dauer des gesamten Skript dauern?
quelle
Antworten:
Ja, einmal für die Dauer der Ausführung Ihres Skripts.
HINWEIS: Wenn Sie Anmeldeinformationen für angeben,
sudo
ist die Authentifizierung in der Shell, in der Sie das Kennwort eingegeben haben, in der Regel 5 Minuten lang gültig. Darüber hinaus werden alle untergeordneten Prozesse, die von dieser Shell ausgeführt werden, oder alle Skripts, die in der Shell ausgeführt werden (Ihr Fall), ebenfalls auf der höheren Ebene ausgeführt.Nein, innerhalb des Skripts tritt keine Zeitüberschreitung auf. Nur wenn Sie sie interaktiv in die Shell eingeben, in der die Anmeldeinformationen bereitgestellt wurden. Bei jeder
Auszug aus der sudo-Manpagesudo
Ausführung innerhalb dieser Shell wird das Timeout zurückgesetzt. In Ihrem Fall bleiben die Anmeldeinformationen jedoch so lange erhalten, wie das Skript Befehle in diesem Skript ausführt und ausführt.quelle
sudo -u $(logname) <command>
sollte arbeiten.bash
Alle untergeordneten Prozesse werden mit Superuser-Berechtigungen ausgeführt. Sie müssen also kein Kennwort für Befehle in Ihrem Bash-Skript erneut eingeben.Das
sudo
Timeout gilt nur für den (späteren) separaten Aufruf vonsudo
. Es würde sich nicht auf Ihren bereits laufenden Bash-Prozess oder einen seiner Nachkommen auswirken.quelle
Diese Antworten sind wahrscheinlich alle richtig. Dies ist jedoch (soweit mir bekannt ist) nicht die allgemein übliche Methode zum Erstellen von Bash-Skripten, für die
sudo
Berechtigungen erforderlich sind . Im Allgemeinen wird im oberen Bereich des Skripts davon ausgegangen, dass es nicht mitsudo
Berechtigungen ausgeführt wurde. Rufensudo -v
Sie stattdessen sich selbst an (wodurch der Benutzer nach seinem Kennwort gefragt wird), um einesudo
Sitzung einzurichten . Sie können entwederecho
einen erläuternden Text vor der Eingabeaufforderung eingeben oder diesudo
eigene Eingabeaufforderung mit dem-p
Schalter überschreiben , um dem Benutzer mitzuteilen, dass Siesudo
für einige Befehle Zugriff benötigen .Dann sollten Sie in Ihrem Skript in Ordnung sein,
sudo
die erforderlichen Befehle (und nur die erforderlichen Befehle) ohne weitere Kennwortanfragen aufzurufen. Wenn Sie der Meinung sind, dass eine bestimmte Gruppe von Befehlen, die in Ihrem Skript zusammen ausgeführt werden (unabhängig von ihrer eigenen Verwendungsudo
), über das sudo-Zeitlimit hinausgeht, können Siesudo -v
diesudo
Sitzung in der Mitte aufrufen , um eine Art "Keep-Alive " auszugeben '.Wenn die
sudo
'Sitzung' während des Skripts abläuft, wird der Benutzer einfach aufgefordert, sein Kennwort einzugeben, wenn Sie das nächste Mal einen sudo-Befehl im Skript ausführen.quelle
sudo -v
Sie den Benutzer erneut nach dem Kennwort fragen. Meiner Meinung nach nicht das schlimmste Problem. Vielleicht ist es hilfreich, den Benutzer auf den Mechanismus aufmerksam zu machen.sudo -u $SUDO_USER
alle Befehle, die kein Rootbefehl erfordern, nicht mit erhöhten Rechten ausgeführt werden müssen. Es fügt leider mehr Code hinzu, ist jedoch die einzige zuverlässige Methode, um Stammdinge in einem lang laufenden Prozess auszuführen./etc/sudoers.d
verwenden,visudo -c -f /tmp/tempsudoers
um sicherzustellen, dass die Datei gültig ist, bevor sie kopiert wird, und diese Datei dann zu entfernen, wenn sie fertig ist (Verwenden einer Falle beim Beenden / Fehler, um sicherzustellen, dass die Eskalation nicht missbraucht werden kann). Die sicherste Implementierung würde es Ihrem Benutzer nur ermöglichen, die spezifischen Befehle in Ihrem Skript mit spezifischen Argumenten ohne Kennwort auszuführen,NOPASSWD
indem Sie jeden Befehl / jedes Argument in einem Array speichern, um die Datei zu erstellen.sudo
Sitzung nicht am Leben erhalten können, wenn eine bestimmte Aufgabe länger dauert als die Zeitüberschreitung. Diese Technik habe ich neulich in Mathias Bynens 'Dotfiles Repo entdeckt:while true; do sudo -n true; sleep 60; kill -0 "$$" || exit; done 2>/dev/null &
- github.com/mathiasbynens/dotfiles/blob/master/.macos#L13