Wenn sich der angeforderte Befehl nicht innerhalb eines Blocks befindet (z. B. Schleife oder Bedingung), können Sie das Skript in drei Teile aufteilen: Die vorhergehenden Befehle werden ausgeführt als myuser
, der geschützte Befehl wird mit ausgeführt sudo
(was nicht bereits gefragt wird root
) und die übrigen Befehle. auch laufen als myuser
: -
su - myuser -c myscript-preamble sudo myscript-protected-command su - myuser -c myscript-postamble
Im Allgemeinen gibt es einen Trick, mit dem Sie sudo
die gespeicherten Anmeldeinformationen verwenden können: -
sudo -u myuser sudo -S true <<< password 2>/dev/null su - myuser -c myscript sudo -u myuser sudo -k
Es gibt eine Reihe von Überlegungen - dies sind die ersten, die mir einfallen: -
- Das Skript (oder zumindest die erste Zeile) muss in einer schreibgeschützten Datei (
-rwx------
) oder in einem durch die Ausführung geschützten Verzeichnis (drwx------
) ausgeführt werden, deren Besitzer beide sindroot
. - Der Trick erfordert, dass die
sudo
Anmeldeinformationen für eine definierte Zeit (eine normale Standardeinstellung) gespeichert werden und diesudo
inmyscript
dieser Zeit ausgeführt wird. - Wenn
myuser
läuft,myscript
währendroot
gleichzeitig es läuft, wird die Erinnerung Anmeldeinformationen verwendet werden, wenn dersudo
Befehl vor Erreichenroot
läuftsudo -k
.
Wie Sie sehen können, ist dies unter Sicherheitsaspekten keine ideale Lösung, kann jedoch in Ihrer Umgebung funktionieren.
Andernfalls müssen Sie sudo -A
wie in diesem Auszug aus dem sudo
Handbuch beschrieben Folgendes verwenden: -
-A, --askpass Normally, if sudo requires a password, it will read it from the user's terminal. If the -A (askpass) option is specified, a (possibly graphical) helper program is executed to read the user's password and output the password to the standard output. If the SUDO_ASKPASS environment variable is set, it specifies the path to the helper program. Otherwise, if sudo.conf(5) contains a line specifying the askpass program, that value will be used. For example: # Path to askpass helper program Path askpass /usr/X11R6/bin/ssh-askpass If no askpass program is available, sudo will exit with an error.
Um dies zu implementieren, müssen Sie ein Programm schreiben, das überprüft, ob es ausgeführt wird als root
: Wenn ja, gibt es das Kennwort für myuser
(aus verschleierten Daten natürlich) aus; Andernfalls werden Sie normalerweise zur Eingabe des Kennworts aufgefordert und geben die Antwort des Benutzers aus.
Ja, es ist möglich, das zu tun, was Sie möchten, es kann jedoch ein erheblicher Arbeitsaufwand erforderlich sein, abhängig von der Sicherheitsstufe, die Sie benötigen.