Bash Scripting: Skript muss als root (oder mit sudo) ausgeführt werden

26

Ich versuche, ein Bash-Skript (in Ubuntu) zu schreiben, das ein Verzeichnis mit tar sichert.

Wie kann ich das Skript so einchecken, dass es nur als root (oder mit sudo) ausgeführt werden kann?

Wenn beispielsweise ein Benutzer das Skript ausführt, sollte er angeben, dass dieses Skript mit sudo-Berechtigungen ausgeführt werden muss, und dann beenden. Wenn das Skript als root ausgeführt wird, wird es nach der Prüfung fortgesetzt.

Ich weiß, dass es eine einfache Lösung geben muss, ich konnte sie einfach nicht durch googeln finden.

Cory Plastek
quelle

Antworten:

37

Verwenden Sie diesen Befehl, um die effektive UID abzurufen:

id -u

Wenn das Ergebnis '0' ist, wird das Skript entweder als root ausgeführt oder verwendet sudo. Sie können die Prüfung ausführen, indem Sie Folgendes ausführen:

if [[ $(/usr/bin/id -u) -ne 0 ]]; then
    echo "Not running as root"
    exit
fi
Scott Pack
quelle
5
Ich würde empfehlen, den Pfad zu id vollständig zu qualifizieren (z. B. / usr / bin / id). Andernfalls könnte ein fehlerhafter Benutzer ein eigenes Skript / eine eigene Binärdatei schreiben, die immer 0 zurückgibt, und diese dann an einer Stelle ablegen, die früher im Pfad des ausführenden Benutzers vorhanden ist.
ktower
Einverstanden. Reparieren mit einer Bearbeitung.
Scott Pack
6
Wenn Sie versuchen, das Skript auszuführen, werden Sie nicht davon abgehalten, den vollständigen Pfad zur ID zu verwenden.
theotherreceive
Ich stimme dem anderen zu ... es ist ein Bash-Skript. Das Qualifizieren des 'ID'-Behälters wird niemanden aufhalten, der ernsthaft daran interessiert ist, den Scheck zu umgehen. Es ist besser, es für die Portabilität unqualifiziert zu lassen.
Chris
1
Dies entspricht nicht der "sudo" -Anforderung.
GregB
17

Ich nehme an, Sie wissen das, indem Sie den Besitzer in root ändern

chown root:root file

und Festlegen der Berechtigungen auf 700

chmod 700 file

Sie werden das Gleiche erreichen - ohne den Vorschlag, als sudo zu laufen.

Aber ich werde diese Antwort der Vollständigkeit halber posten.

Brent
quelle
3
Dies ist eine zweckmäßigere Lösung als die akzeptierte Antwort. - Meine $ 0,02
Chris
Randnotiz: Das Einchecken des Skripts in Git wird schwieriger. Zum Reparierensudo git add <file>
Chaim Eliyah
2

Was ist Ihr Ziel hier, um den Benutzer zu informieren, dass er das Skript als root oder als Sicherheitsmaßnahme ausführen soll?

Wenn Sie den Benutzer nur darüber informieren möchten, dass die UID-Vorschläge in Ordnung sind, sie aber aus Sicherheitsgründen genauso nützlich sind wie Reifen auf einem Pferd - es gibt nichts, was einen Benutzer davon abhält, das Skript zu kopieren und die if-Anweisung zu entfernen. und läuft es trotzdem.

Wenn es sich um ein Sicherheitsproblem handelt, sollte das Skript auf 700 gesetzt werden, das root gehört: root, damit es von keinem anderen Benutzer gelesen oder ausgeführt werden kann.

theotherreceive
quelle
Oder es könnte sein, dass das Skript Zugriff auf Dateien oder Befehle benötigt, auf die nur root zugreifen kann, um seine Arbeit auszuführen, wie in meinem Fall
chrisbunney 30.09.11
2

Sie können auch den whoami-Befehl verwenden.

if [ ! "`whoami`" = "root" ]
then
    echo "\nPlease run script as root."
    exit 1
fi
Kiril
quelle
Tatsächlich ist die UID 0 das spezielle Benutzerkonto mit allen Berechtigungen. "root" ist einfach die häufigste Bezeichnung / der häufigste Name, die dieser UID zugeordnet ist. Es muss nicht haben sein ‚root‘ und ein Angreifer kann versuchen, diese zu nutzen.
0xSheepdog
2

Die Bash-Variable $EUIDzeigt die effektive UID an, unter der das Skript ausgeführt wird. Wenn Sie sicherstellen möchten, dass das Skript als Root ausgeführt wird, überprüfen Sie, ob $EUIDder Wert 0 vorliegt oder nicht:

if [ $EUID -ne 0 ]; then
    echo "$0 is not running as root. Aborting."
    exit 2
fi

Dies ist besser als die Lösung mit /usr/bin/id(für Bash-Skripte!), Da es keinen externen Befehl erfordert.

neuhaus
quelle
Anstatt nur Verlassen könnte den Benutzer für sudo Login - Aufforderung durch die Ersetzung echoLinie mit sudo "$0" "$@"und ersetzen exit 2mit exit $?.
schumacher574
0

Eine einfache Möglichkeit, das Skript nur für root ausführbar zu machen, besteht darin, das Skript mit der folgenden Zeile zu starten:
#!/bin/su root

alexandre1985
quelle
-1

Mit "#! / bin / su root" können Benutzer im Superuser-Modus das Skript ausführen, ohne das root-Kennwort zu verwenden. Wenn Sie möchten, dass Superuser das Skript mit den Ergebnissen von root ausführen, geschieht dies folgendermaßen.

Lynnux
quelle