In Bash prüfen, ob ein Skript mit Root-Rechten ausgeführt wird
June 5, 2014
Viele administrative Skripte erfordern Root-Rechte, um auf geschützte Systemressourcen zuzugreifen oder systemweite Änderungen vorzunehmen. Es ist eine bewährte Methode, zu Beginn eines solchen Skripts zu überprüfen, ob es mit den erforderlichen Berechtigungen ausgeführt wird, und andernfalls mit einer klaren Fehlermeldung abzubrechen.
Die zuverlässigste Methode hierfür ist die Überprüfung der User ID (UID) des ausführenden Benutzers. Der root-Benutzer hat immer die UID 0.
Methode 1: Überprüfung der EUID (Empfohlen)
Die Variable $EUID (Effective User ID) enthält die ID des Benutzers, mit dessen Rechten der aktuelle Prozess ausgeführt wird. Wenn ein Skript mit sudo gestartet wird, ist die $EUID 0, auch wenn die $UID (die ID des ursprünglichen Benutzers) ungleich 0 ist. Daher ist $EUID die robusteste Wahl.
#!/usr/bin/env bash
# Überprüft, ob die effektive User ID nicht 0 ist
if [ "$EUID" -ne 0 ]; then
echo "Fehler: Dieses Skript muss mit Root-Rechten ausgeführt werden." >&2
echo "Bitte verwenden Sie 'sudo'." >&2
exit 1
fi
echo "Skript wird mit Root-Rechten ausgeführt..."
# ... weitere administrative Befehle ...
Methode 2: Überprüfung mit id -u
Der Befehl id -u gibt die effektive User ID des aktuellen Benutzers aus. Diese Methode ist POSIX-konform und funktioniert auch in Shells, die die $EUID-Variable nicht definieren (z.B. sh).
#!/usr/bin/env bash
# Überprüft, ob die Ausgabe von 'id -u' nicht 0 ist
if [ "$(id -u)" -ne 0 ]; then
echo "Fehler: Bitte führen Sie dieses Skript als Root oder mit 'sudo' aus." >&2
exit 1
fi
echo "Root-Rechte erfolgreich überprüft."
Automatischer Neustart mit sudo (Auto-Re-execution)
Ein fortgeschrittenes Muster ist, das Skript automatisch mit sudo neu zu starten, falls es ohne Root-Rechte aufgerufen wurde. Dies kann die Benutzerfreundlichkeit erhöhen, sollte aber mit Bedacht eingesetzt werden, da es den Benutzer implizit zur Passworteingabe auffordert.
#!/usr/bin/env bash
# Wenn der Benutzer nicht root ist...
if [ "$EUID" -ne 0 ]; then
# ... starte das Skript selbst mit sudo neu und übergebe alle Argumente.
echo "Keine Root-Rechte. Fordere sudo-Passwort an..."
exec sudo "$0" "$@"
fi
# Ab hier hat das Skript garantiert Root-Rechte
echo "Ausführung mit Root-Rechten."
# ... administrative Befehle ...
exec: Ersetzt den aktuellen Shell-Prozess durch den neuensudo-Prozess."$0": Der Name des aktuellen Skripts."$@": Alle ursprünglich an das Skript übergebenen Argumente.
Fazit
Die Überprüfung auf Root-Rechte zu Beginn eines administrativen Skripts ist eine einfache, aber entscheidende Maßnahme zur Fehlervermeidung. Die Verwendung der $EUID-Variable ist in reinen Bash-Skripten der direkteste Weg, während id -u eine höhere Portabilität über verschiedene Shells hinweg bietet.