Frage Bash Scripting: Erfordert, dass das Skript als root (oder mit sudo) ausgeführt wird


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

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

Zum Beispiel, wenn ein Benutzer das Skript ausführt, sollte es sagen, dass dieses Skript mit Sudo-Privilegien 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 nur nicht finden, indem ich google.


23
2017-07-08 17:30


Ursprung




Antworten:


Um die effektive UID zu ziehen, benutze diesen Befehl:

id -u

Wenn das Ergebnis '0' ist, wird das Skript entweder als root oder mit sudo ausgeführt. Sie können den Check ausführen, indem Sie Folgendes tun:

if [[ $(/usr/bin/id -u) -ne 0 ]]; then
    echo "Not running as root"
    exit
fi

34
2017-07-08 17:36



Ich würde empfehlen, den Pfad zur ID vollständig zu qualifizieren (z. B. / usr / bin / id). Andernfalls könnte ein hinterhältiger Benutzer sein eigenes Skript / eine eigene Binärdatei schreiben, die immer 0 zurückgibt und sie dann an einem Ort ablegt, der früher im Pfad der ausführenden Benutzer existiert. - ktower
Einverstanden. Reparieren mit einem Edit. - Scott Pack
Jeder, der versucht, das Skript auszuführen, wird nicht gestoppt, wenn Sie den vollständigen Pfad zur ID verwenden. - theotherreceive
Genau das suche ich. Vielen Dank - Cory Plastek
Dies betrifft nicht die Anforderung von "sudo". - GregB


Ich nehme an, dass Sie das wissen, indem Sie den Besitz zu root ändern

chown root:root Datei

und setze die Berechtigungen auf 700

chmod 700 Datei

Sie werden dasselbe erreichen - ohne den Vorschlag, als Sudo zu laufen.

Aber ich werde diese Antwort auf Vollständigkeit posten.


16
2017-07-08 17:43



Dies ist eine geeignetere Lösung als die akzeptierte Antwort. - Meine $ 0,02 - Chris
Randnotiz: Das Überprüfen des Skripts in Git wird schwieriger. Reparieren, sudo git add <file> - Chaim Eliyah


Was ist Ihr Ziel hier, den Benutzer zu informieren, dass sie das Skript als root oder als eine Art Sicherheitsvorkehrung ausführen sollten?

Wenn Sie den Benutzer nur darüber informieren möchten, dass alle Vorschläge der UID gut sind, aber sie sind als Sicherheitsvorkehrungen so nützlich wie Reifen auf einem Pferd - es gibt nichts, was einen Benutzer davon abhält, das Skript zu kopieren und die if-Anweisung herauszunehmen, und es trotzdem laufen zu lassen.

Wenn dies ein Sicherheitsproblem ist, sollte das Skript auf 700 gesetzt werden, und zwar im Besitz von root: root, so dass es von keinem anderen Benutzer lesbar oder ausführbar ist.


2
2017-07-08 18:02



Oder es könnte sein, dass das Skript Zugriff auf Dateien oder Befehle benötigt, die nur für root zugänglich sind, um seine Arbeit auszuführen, wie in meinem Fall - chrisbunney


Sie können auch den whoami-Befehl verwenden.

if [ ! "`whoami`" = "root" ]
then
    echo "\nPlease run script as root."
    exit 1
fi

2
2017-07-22 09:12



Eigentlich ist die UID 0 das spezielle Benutzerkonto mit voller Berechtigung. "root" ist einfach die gebräuchlichste Bezeichnung / Name, die dieser UID zugeordnet ist. Es tut es nicht haben "Root" sein und ein Angreifer könnte versuchen, dies auszunutzen. - 0xSheepdog


Die Bash-Variable $EUID Zeigt 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 es auch funktioniert $EUID enthält den Wert 0 oder nicht:

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

Das ist besser als die Lösung mit /usr/bin/id (für Bash-Skripte!), da es keinen externen Befehl benötigt.


1
2018-03-24 13:56



Statt nur zu beenden, könnte der Benutzer zur sudo-Anmeldung aufgefordert werden, indem er die echo Linie mit sudo "$0" "$@"und ersetzen exit 2 mit exit $?. - schumacher574


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


0
2017-08-13 20:55





Mit "#! / bin / su root" können Benutzer im Super-User-Modus das Skript ausführen, ohne das root-Passwort zu verwenden. Wenn Sie möchten, dass Superbenutzer das Skript mit den Ergebnissen von root ausführen, wird dies erledigt.


-1
2018-05-15 18:12