Ein Beispielskript kann wie folgt aussehen:
#!/bin/bash
sudo su
ls /root
Wenn Sie ./test.sh
als normaler Benutzer arbeiten und stattdessen ls
als Superuser ausführen und beenden, wird zu root gewechselt. und wenn ich mich abmelde, wird es ls /root
als normaler Benutzer ausgeführt.
Kann mir jemand etwas über den Mechanismus erzählen?
sudo su
macht meine Augen weh.sudo -s
?sudo su
weil ich mehr an die Optionen von gewöhnt binsu
als an die vonsudo
. Ich kenne die Optionen von sudo gut genug, aber ich kann die su-Optionen schneller eingeben. Aber ja, das heißt, ich kenne sudo nicht gut genug.sudo -i
so,su -
alssudo -s
ob es funktioniert wiesu
(ohne Bindestrich)Antworten:
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
Das Wrapper-Skript ruft das Hauptskript mit den folgenden Root-Berechtigungen auf
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
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
quelle
Verwenden Sie im Skript Folgendes.
Der Code zwischen dem HERE-Block wird als root ausgeführt.
quelle
sudo su
ruft zwei Programme auf. Verwenden Siesudo -s <<HEREDOC
odersu user <<HEREDOC
... Dumme 5-Minuten-Grenze.Ohne weitere Argumente
su
wird die Login-Shell für root ausgeführt. Genau das macht die erste Zeile Ihres Skripts. Wenn Sie verlassen, um die Login - Shell schließen, so kehrt und Ihr Skript wird die Ausführung, die mit der zweiten Zeile ist:ls /root
. Ich denke du kannst einfachsudo ls /root
machen was du willst.quelle
ls
, aber das ist nur ein Beispiel. Tatsächlich muss ich noch viel mehr mit Root-Rechten machen :-) Also bevorzuge ich die Antwort von @ Ankit.Sobald Sie
sudo su
einen neuen Prozess mit dem Effekt "userid (euid=EUID)
Super User Forked" starten, wird eine neue Bash mit einer anderen Prozess-ID ausgeführt(pid=PID)
, die demselben Terminal zugeordnet ist(tname=TTY)
.Erläuterung
Angenommen,
ps -A | grep bash
Sie haben nach dem Abfeuern eine21460 pts/2 00:00:00 bash
Ausgabe. Jetzt, wenn Sie./test.sh
beide Befehle ausführensudo su
undls /root
auf gespoolt werdenPID 21460
. Nach der Ausführung, wenn Sieroot
als aktiver Benutzerps -A | grep bash
erneut getroffen haben , wird eine neue Bash ausgeführtPID say, 21570
. Das Beenden von beendetroot bash
die neu gegabelte Bashuser's bash
und führt den Spool-Befehl aus,ls /root
bevor die Eingabeaufforderung freigegeben wird.quelle