GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Warum führt „sudo Su“ in einem Shell-Skript den Rest des Skripts nicht als Root aus?

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
Linux
  1. Wie führe ich einen Befehl als Systemadministrator (root) aus?

  2. Warum erkennt das Bash-Skript keine Aliase?

  3. Warum funktioniert das ~/.bash_profile nicht?

  4. Wie lässt sich ein Skript rückwirkend als Root ausführen?

  5. Wo wird ein Shell-Skript ausgeführt?

So führen Sie einen Linux-Shell-Befehl / ein Skript im Hintergrund aus

So führen Sie Shell-Skript als SystemD-Dienst in Linux aus

So erstellen und führen Sie ein Shell-Skript in Ubuntu 22.04 aus

Führen Sie ein Shell-Skript über den Befehl docker-compose im Container aus

Kali Linux VM:Berechtigung zum Ausführen des Shell-Skripts als Root verweigert

Führen Sie ein Shell-Skript als ein anderer Benutzer aus