Ein Beispielskript kann wie folgt aussehen:
#!/bin/bash
sudo su
ls /root
Bei Verwendung von ./test.sh
Führen Sie als normaler Benutzer stattdessen ls
aus als Superuser und Exit wechselt es zu Root; und wenn ich mich abmelde, wird ls /root
ausgeführt als normaler Benutzer.
Kann mir jemand etwas über den Mechanismus darüber sagen?
Akzeptierte Antwort:
Die Befehle in einem Skript werden unabhängig voneinander einzeln ausgeführt. Das Skript selbst, als übergeordnetes Element aller Befehle im Skript, ist ein weiterer unabhängiger Prozess, und der Befehl su kann und kann ihn nicht in root ändern:Der Befehl su erstellt einen neuen Prozess mit Root-Rechten.
Nachdem dieser su-Befehl abgeschlossen ist, führt der übergeordnete Prozess, der immer noch unter demselben Benutzer ausgeführt wird, den Rest des Skripts aus.
Was Sie tun möchten, ist ein Wrapper-Skript zu schreiben. Die privilegierten Befehle gehen in das Hauptskript, zum Beispiel ~/main.sh
#!/bin/sh
ls /root
Das Wrapper-Skript ruft das Hauptskript mit Root-Rechten auf, so
#!/bin/sh
su -c ~/main.sh root
Um diesen Prozess zu starten, führen Sie den Wrapper aus, der wiederum das Hauptskript startet, nachdem der Benutzer zum Root-Benutzer gewechselt ist.
Diese Wrapper-Technik kann verwendet werden, um das Skript in einen Wrapper um sich selbst zu verwandeln. Überprüfen Sie grundsätzlich, ob es als root läuft, wenn nicht, verwenden Sie „su“, um sich selbst neu zu starten.
$0 ist eine praktische Möglichkeit, 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“, was seine Ausführung effektiv beendet und das neue Programm startet, das von su mit root gestartet wird, um von oben zu laufen. Die Ersetzungsinstanz ist „root“, sodass sie die rechte Seite von ||
nicht ausführt