Die Befehle in einem Skript werden einzeln und unabhängig voneinander ausgeführt. Das Skript selbst ist als übergeordnetes Element aller Befehle im Skript ein weiterer unabhängiger Prozess, und der Befehl su ändert es nicht und kann es nicht in root ändern: Der Befehl su erstellt einen neuen Prozess mit Root-Rechten.
Nachdem der Befehl su ausgeführt wurde, führt der übergeordnete Prozess, der immer noch als derselbe Benutzer ausgeführt wird, den Rest des Skripts aus.
Sie möchten ein Wrapper-Skript schreiben. Die privilegierten Befehle gehen beispielsweise in das Hauptskript ein~/main.sh
#!/bin/sh
ls /root
Das Wrapper-Skript ruft das Hauptskript mit den folgenden Root-Berechtigungen auf
#!/bin/sh
su -c ~/main.sh root
Um diesen Prozess zu starten, führen Sie den Wrapper aus, der seinerseits das Hauptskript startet, nachdem der Benutzer zum Root-Benutzer gewechselt wurde.
Mit dieser Wrapper-Technik können Sie das Skript in einen Wrapper um sich selbst verwandeln. Überprüfen Sie im Allgemeinen, ob es als Root ausgeführt wird. Andernfalls verwenden Sie "su", um sich selbst neu zu starten.
$ 0 ist eine praktische Methode, um ein Skript auf sich selbst verweisen zu lassen, und der whoami-Befehl kann uns sagen, wer wir sind (sind wir root?)
So wird das Hauptskript mit eingebautem Wrapper
#!/bin/sh
[ `whoami` = root ] || exec su -c $0 root
ls /root
Beachten Sie die Verwendung von exec. Es bedeutet "dieses Programm ersetzen durch", wodurch die Ausführung effektiv beendet wird und das neue Programm, das von su mit root gestartet wurde, von oben ausgeführt wird. Die Ersetzungsinstanz ist "root", sodass sie nicht die rechte Seite des || ausführt
sudo su
macht meine Augen weh.