437 Stimmen

Wie man in einem Bash-Skript überprüft, ob man als Root läuft

Ich schreibe ein Skript, das Root-Berechtigungen erfordert, und ich möchte es so machen, dass es einfach "Bitte als Root ausführen" ausgibt und beendet, wenn das Skript nicht als Root ausgeführt wird.

Hier ist etwas Pseudocode für das, was ich suche:

if (whoami != root)
  then echo "Bitte als Root ausführen"

  else (Aktionen ausführen)
fi

exit

Wie könnte ich das am besten (sauber und sicher) umsetzen? Vielen Dank!

Ach, um es klarzustellen: Der Teil (Aktionen ausführen) würde das Ausführen von Befehlen erfordern, die selbst Root-Rechte benötigen. Das Ausführen als normaler Benutzer würde also einfach einen Fehler verursachen. Dies soll nur dazu dienen, ein Skript sauber auszuführen, das Root-Befehle erfordert, ohne sudo im Skript zu verwenden. Ich suche nur etwas syntaktischen Zucker.

5voto

John Kugelman Punkte 327535

Wenn das Skript wirklich Root-Zugriff erfordert, sollten dessen Dateiberechtigungen das widerspiegeln. Ein Root-Skript, das von Nicht-Root-Benutzern ausführbar ist, wäre ein Warnzeichen. Ich ermutige Sie, den Zugriff nicht mit einer if-Überprüfung zu kontrollieren.

chown root:root script.sh
chmod u=rwx,go=r script.sh

5voto

MLSC Punkte 5564

Versuchen Sie den folgenden Code:

#!/bin/sh

if [ "$(id -u)" -ne 0 ]; then
    echo "Entschuldigung, Sie sind nicht root." >&2
    exit 1
fi

Hinweis zur Bearbeitung: Backticks gelten inzwischen als veraltet (<a href="https://unix.stackexchange.com/a/126928/126755">viele weitere Hinweise</a>).

3voto

WebBrother Punkte 1165

Soweit ich weiß, ist der richtige Weg, es zu überprüfen, wie folgt:

#!/bin/sh

if [ "$(id -u)" -eq 0 ]; then
    echo "Du bist root."
else
    echo "Du bist NICHT root." >&2
fi

OP's Hinweis: Sie können den Abschnitt "Testing For Root" auf linuxcommand.org sehen.

Anmerkung des Editors: Ich habe dieses Shell-Snippet leicht angepasst, um es POSIX-kompatibel zu machen.

3voto

Smeterlink Punkte 646

id -u ist viel besser als whoami, da einige Systeme wie Android das Wort root möglicherweise nicht bereitstellen.


Beispielbefehl:

# whoami

Beispiel Ausgabe:

whoami: unknown uid 0

3voto

Sr. Libre Punkte 163

Das Problem bei der Verwendung von: id -u, $EUID und whoami ist, dass sie alle falsche positive Werte zurückgeben, wenn ich den Root manipuliere, so wie hier:

$ fakeroot

id:

$ id -u
0

$EUID:

$ echo $EUID
0

whoami:

$ whoami
root

Ein zuverlässiger (und hackiger) Weg ist es dann zu überprüfen, ob der Benutzer Zugriff auf das Verzeichnis /root hat:

$ ls /root >/dev/null 2>&1 && is_root=true || is_root=false; echo "$is_root"

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X