Ich schreibe ein Skript (eigentlich eine Kombination aus Skripten und Makefile), das externe Abhängigkeiten installiert: einige apt-get
Befehle, einige git
Klonen, Erstellen, Installieren, Hinzufügen von Benutzern zu Gruppen, ...
Einige der Vorgänge in diesen Skripten erfordern Superuser-Berechtigungen, andere nicht.
Bisher habe ich den gesamten make-Prozess mit sudo ausgeführt, aber er hat einige Nachteile:
git
repos, die ichroot
als Eigentümer bekomme , kann ich ohnesudo
oder nicht nachträglich ändernchown
- Die Skripte, die Benutzer zu Gruppen hinzufügen, wissen nicht, welchen Benutzer sie hinzufügen sollen, da sie
whoami
zurückgegeben werdenroot
Was ist die beste Möglichkeit, als Superuser nur die Befehle auszuführen, die dies erfordern? Im Idealfall würde der Vorgang weiterhin die Eingabe meines sudo
Kennworts erfordern , jedoch nur einmal zu Beginn des Installationsvorgangs. Es würde es dann ganz am Ende vergessen, aber es die ganze Zeit bis dahin behalten (es kann mehrere Stunden dauern).
Die Lösungen, die ich online gefunden habe, umfassen:
sudo -v
am anfang des skripts, aber wenn ich das richtig verstehe läuft das mal ab. Mein Skript könnte ein paar Stunden lang laufen- Ausführen des Skripts mit
sudo
, aber mit den Befehlen, die keinen Superuser benötigensudo -u $(logname) <command>
. Das ist, was ich jetzt mache, aber es fühlt sich so an, als sollte es umgekehrt sein.
Idealerweise möchte ich, dass mein Skript:
- Fragen Sie nach Superuser-Anmeldeinformationen
- Führen Sie normale Befehle als angemeldeter Benutzer aus
- Führen Sie sudo-Befehle mit den in Schritt 1 eingegebenen Anmeldeinformationen aus
sudo -k
um die Superuser-Sitzung zu schließen
SUDO_USER
Umgebungsvariable überprüfen . Falls vorhanden, enthält es den Benutzernamen des Benutzers, der sudo aufruft. So können Sie (als root) $ SUDO_USER: $ SUDO_GID $ your_files chown. Ebenso können Sie diese Variablen überprüfen, damit Ihre adduser-Befehle wissen, welcher Benutzer hinzugefügt werden soll.su $SUDO_USER -c command
ausführen und für die Befehle als normaler Benutzer ausführen.Antworten:
Da Sie sudo-Zugriff haben, erstellen Sie eine sudoers-Datei für sich selbst und löschen Sie diese, wenn das Skript fertig ist:
quelle
Eine Möglichkeit, dass ich nicht empfehlen generell, ist in dem Passwort selbst, und die Nutzung zu lesen
sudo
‚s-S
Option , das Passwort zu übergeben , wie und bei Bedarf:Von
man sudo
:quelle
echo "$password"
??echo "$password"
wäre nicht, aber Heredocs und Herestrings sind etwas sicherer. Sie sind in der Befehlszeile, die mit den üblichen Tools angezeigt wird, nicht sichtbar.echo "$password"
auf der linke Seite eines Rohrs ist in einer Bash - Skript sicher.echo
ist eine eingebaute Shell;/bin/echo
läuft nicht, wenn es so einfach heißtecho ...
. Einige andere Shells verfügen über eine integrierteecho
Funktion (dash
z. B.), für Bourne-Shells ist jedoch keine erforderlich . Ich halteecho "$password" |
das für akzeptabel, kann aber am besten vermieden werden, wenn jemand das Skript auf eine andere Shell portiert, ohne das Problem zu bemerken. Ich benutze ein nicht portierbares[[
statt[
in diesem Skript , um die gleiche Art von Problem abzuwenden. @KasiyA