Ich habe ein langes und lang laufendes Bash-Skript, in dem eine Handvoll Befehle als Root ausgeführt werden müssen, während die meisten Befehle als normaler Benutzer vor sudo ausgeführt werden müssen, da dies den Dateibesitz und dergleichen durcheinander bringen würde.
Ich habe mir einige Methoden ausgedacht, aber jede hat einige Probleme
Methode 1: Verwenden von sudo in der Datei
#!/bin/bash
sudo echo "I must be run by root"
touch needsToBeOwnedByUser1
echo "needs to be run by user"
sleep 1000
sudo echo "I, again, must be run by root"
Das würde gut aussehen, wenn man bedenkt, wie der Code geschrieben ist. sudo
wird vor den wenigen Anweisungen geschrieben, die tatsächlich von root ausgeführt werden müssen, aber wenn die Zeit zwischen jedem sudo
Aufruf zu lang ist, werden Sie sudo
erneut nach einem Kennwort gefragt. Wenn die erste Ausführung von sudo
fehlschlägt, z. B. aufgrund eines ungültigen Kennworts, wird der Rest des Skripts weiterhin ausgeführt.
Methode 2: Verwenden von sudo, um die Datei aufzurufen und bei Bedarf zum ursprünglichen Benutzer zurückzukehren
#!/bin/bash
echo "I must be run by root"
su username -c 'touch needsToBeOwnedByUser1'
su username -c 'echo "needs to be run by user"'
su username -c 'sleep 1000'
echo "I, again, must be run by root"
Das ist auch scheiße, weil ich su username -c
vor fast jeder Zeile hinzufügen muss. Auch das Auffinden des ursprünglichen Benutzernamens nach sudo
ist möglich, aber umständlich.
Gibt es einen besseren Weg?
Bearbeiten: Ich habe hier nur kleine, unsinnige Skripte gepostet, um zu zeigen, wovon ich spreche. Im eigentlichen Skript habe ich einige Zeilen, die sudo benötigen (Dienste starten und stoppen), einige Zeilen, in denen es keine Rolle spielt, ob es sudo gibt, und ziemlich viele Zeilen, die wirklich ohne sudo ausgeführt werden müssen.
sudo
wenn es über erhöhte Berechtigungen verfügt. Aber es macht keinen Sinn, zu wechseln,su username -c
um eine auszuführenecho
. Mit anderen Worten, das klingt nach einem [XY]. Könnten Sie bearbeiten und erklären, was Ihr Skript tatsächlich tut und warum Sie das Gefühl haben, dass Sie so oft den Benutzer wechseln müssen?man sudo
?-v, --validate
'Aktualisieren Sie die zwischengespeicherten Anmeldeinformationen des Benutzers und authentifizieren Sie den Benutzer bei Bedarf. Für das sudoers-Plugin verlängert dies das sudo-Timeout standardmäßig um weitere 15 Minuten, führt jedoch keinen Befehl aus. Nicht alle Sicherheitsrichtlinien unterstützen zwischengespeicherte Anmeldeinformationen. ' (Wenn Sie es oft genug ausführen, sollte die Sudo-Authentifizierung keine Zeitüberschreitung aufweisen.)Antworten:
In Bezug auf Methode 2 ist es einfacher, eine Funktion zu verwenden. Zum Beispiel:
$SUDO_USER
ist der Benutzername des Sudoer. Sie könnten auch$(logname)
an seiner Stelle verwenden.Laufen auf meinem Computer:
quelle
Beim Lesen
man sudoers
sieht man:Auf diese Weise können Sie zulassen, dass der
regular
Hostmachine1
ausgeführt wirdcommand1
undcommand2
als Root ohne Kennwortauthentifizierung mit:aber lesen Sie jedes
man -k sudo
für Details.quelle