it-swarm.com.de

So prüfen Sie, ob Sie als Root in einem Bash-Skript ausgeführt werden

Ich schreibe ein Skript, für das Berechtigungen auf Root-Ebene erforderlich sind. Wenn das Skript nicht als Root ausgeführt wird, wird einfach die Meldung "Bitte als Root ausführen" ausgegeben. und Ausgänge.

Hier ist ein Pseudocode für das, wonach ich suche:

if (whoami != root)
  then echo "Please run as root"

  else (do stuff)
fi

exit

Wie kann ich das am besten (sauber und sicher) erreichen? Vielen Dank!

Ah, nur um es zu verdeutlichen: Der (do stuff) Teil würde das Ausführen von Befehlen beinhalten, die an und für sich root benötigen. Wenn Sie es also als normaler Benutzer ausführen, wird nur ein Fehler angezeigt. Dies ist nur dazu gedacht, ein Skript sauber auszuführen, das root-Befehle erfordert, ohne Sudo innerhalb des Skripts zu verwenden. Ich suche nur nach syntaktischem Zucker.

240
Nathan

Es wurden einige Antworten gegeben, aber es scheint, dass die beste Methode darin besteht, Folgendes zu verwenden:

  • id -u
  • Wenn es als root ausgeführt wird, wird eine ID von 0 zurückgegeben.

Dies scheint zuverlässiger zu sein als die anderen Methoden, und es scheint, dass es eine ID von 0 zurückgibt, auch wenn das Skript über Sudo ausgeführt wird.

58
Nathan

Die Umgebungsvariable $ EUID enthält die UID des aktuellen Benutzers. Roots UID ist 0. Verwenden Sie in Ihrem Skript Folgendes:

if [ "$EUID" -ne 0 ]
  then echo "Please run as root"
  exit
fi

Anmerkung: Wenn Sie 2: [: Illegal number: überprüfe ob du #!/bin/sh oben und ändere es in #!/bin/bash.

344
ptierno

In einem Bash-Skript haben Sie verschiedene Möglichkeiten, um zu überprüfen, ob der aktuelle Benutzer root ist.

Überprüfen Sie als Warnung nicht, ob ein Benutzer root ist, indem Sie den Benutzernamen root verwenden. Nichts garantiert, dass der Benutzer mit der ID 0 root heißt. Es ist eine sehr strenge Konvention, die weitgehend befolgt wird, aber jeder kann den Superuser umbenennen.

Ich denke, der beste Weg bei der Verwendung von bash ist die Verwendung von $EUID, von der Manpage:

EUID   Expands to the effective user ID of the current  user,  initialized
       at Shell startup.  This variable is readonly.

Dies ist ein besserer Weg als $UID, der geändert werden kann und nicht den tatsächlichen Benutzer widerspiegelt, der das Skript ausführt.

if (( $EUID != 0 )); then
    echo "Please run as root"
    exit
fi

Ein Weg, wie ich mich einem solchen Problem nähere, besteht darin, Sudo in meine Befehle einzufügen, wenn ich nicht als root ausgeführt werde. Hier ist ein Beispiel:

Sudo=''
if (( $EUID != 0 )); then
    Sudo='Sudo'
fi
$Sudo a_command

Auf diese Weise wird mein Befehl von root ausgeführt, wenn der Superuser verwendet wird, oder von Sudo, wenn er von einem normalen Benutzer ausgeführt wird.

Wenn Ihr Skript immer von root ausgeführt werden soll, setzen Sie einfach die Rechte entsprechend (0500).

73
sberder
if [[ $(id -u) -ne 0 ]] ; then echo "Please run as root" ; exit 1 ; fi

oder

if [[ `id -u` -ne 0 ]] ; then echo "Please run as root" ; exit 1 ; fi

:)

47
Dale_Reagan

Wie @wrikken in seinen Kommentaren erwähnte, id -u ist eine viel bessere Suche nach root.

Bei ordnungsgemäßer Verwendung von Sudo kann das Skript außerdem überprüft werden, ob es als root ausgeführt wird. Wenn nicht, lassen Sie es sich über Sudo zurückrufen und dann mit Root-Berechtigungen ausführen.

Abhängig von der Ausführung des Skripts besteht eine weitere Option darin, einen Sudo -Eintrag für die speziellen Befehle einzurichten, die das Skript möglicherweise benötigt.

29

Es gibt eine einfache Überprüfung, ob ein Benutzer root ist.

Das [[ stuff ]] Syntax ist die Standardmethode zum Ausführen einer Bash-Prüfung.

error() {
  printf '\E[31m'; echo "[email protected]"; printf '\E[0m'
}

if [[ $EUID -eq 0 ]]; then
    error "This script should not be run using Sudo or as the root user"
    exit 1
fi

Dies setzt auch voraus, dass Sie mit einer 1 beenden möchten, wenn Sie fehlschlagen. Die error -Funktion ist etwas Flair, das den ausgegebenen Text auf Rot setzt (nicht erforderlich, aber ziemlich edel, wenn Sie mich fragen).

21

0- Lies die offizielle GNU Linux-Dokumentation, es gibt viele Möglichkeiten, das richtig zu machen.

1- Vergewissern Sie sich, dass Sie die Shell-Signatur eingegeben haben, um Interpretationsfehler zu vermeiden:

 #!/bin/bash

2- Das ist mein Drehbuch

#!/bin/bash 

if [[ $EUID > 0 ]]; then # we can compare directly with this syntax.
  echo "Please run as root/Sudo"
  exit 1
else
  #do your stuff
fi
11
Sergio Abreu

Ganz einfach gesagt:

if [ "$(whoami)" == "root" ] ; then
    # you are root
else
    # you are not root
fi

Der Vorteil dieser Option anstelle von id besteht darin, dass Sie überprüfen können, ob der Befehl auch von einem bestimmten Benutzer ohne Rootberechtigung ausgeführt wird. z.B.

if [ "$(whoami)" == "john" ] ; then
    # you are john
else
    # you are not john
fi
9
Matthew Trotter

Wenn das Skript wirklich root-Zugriff benötigt, sollten seine Dateiberechtigungen dies widerspiegeln. Ein Root-Skript, das von Nicht-Root-Benutzern ausgeführt werden kann, wäre eine rote Fahne. Ich empfehle Ihnen, den Zugriff nicht mit einem if Check zu kontrollieren.

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

versuchen Sie den folgenden Code:

if [ "$(id -u)" != "0" ]; then
    echo "Sorry, you are not root."
    exit 1
fi

OR

if [ `id -u` != "0" ]; then
    echo "Sorry, you are not root."
    exit 1
fi
5
MLSC

In dieser Antwort gehe ich davon aus, dass der Leser bash und POSIX lesen kann Shell-Skript wie dash .

Ich glaube, es gibt hier nicht viel zu erklären, da hoch gestimmte Antworten viel erklären.

Wenn es dennoch etwas zu erklären gibt, zögern Sie nicht, einen Kommentar abzugeben. Ich werde mein Bestes tun, um die Lücken zu füllen.

Optimierte bash Lösung für Leistung und Zuverlässigkeit

überprüft, um mit GNU bash, Version 4.4.19 sowohl als root als auch mit Sudo zu arbeiten

#!/bin/bash

function am_i_root {
    ! (( ${EUID:-0} || $(id -u) ))
}

if am_i_root; then
    tput bold; tput setaf 2; echo 'Ok, you are root!'; tput sgr0
else
    tput bold; tput setaf 1; echo 'Sad, you are NOT root :('; tput sgr0
fi

Erläuterung

Da es um ein Vielfaches schneller ist, die Variable $EUID Standard bash , die effektive Benutzer-ID-Nummer, zu lesen, als den Befehl id -u Auszuführen, um POSIX - finde die Benutzer-ID, diese Lösung kombiniert beides zu einer schön gepackten Funktion. Wenn und nur wenn der $EUID Aus irgendeinem Grund nicht verfügbar ist, wird der Befehl id -u Ausgeführt, um sicherzustellen, dass wir den richtigen Rückgabewert erhalten egal unter welchen Umständen.

Warum ich diese Lösung nach so vielen Jahren poste, hat das OP gefragt

Nun, wenn ich richtig sehe, scheint es oben einen fehlenden Code zu geben.

Sie sehen, es gibt viele Variablen, die berücksichtigt werden müssen, und eine davon ist die Kombination von Leistung und Zuverlässigkeit .


POSIX Lösung

überprüft, um auf dash Version 0.5.8 sowohl als root als auch mit Sudo zu arbeiten

#!/bin/sh

am_i_root() {
    [ "$(id -u)" -eq 0 ]
}

if am_i_root; then
    tput bold; tput setaf 2; echo 'Ok, you are root!'; tput sgr0
else
    tput bold; tput setaf 1; echo 'Sad, you are NOT root :('; tput sgr0
fi

Fazit

So sehr es Ihnen vielleicht auch nicht gefällt, die Linux-Umgebung hat sich stark verändert. Das heißt, es gibt Leute, die bash so mögen, dass sie nicht einmal an Portabilität denken ( POSIX shells ). Andere wie ich bevorzugen die POSIX Shells. Es ist heutzutage eine Frage der persönlichen Wahl und der Bedürfnisse.

5

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

2
alexandre1985

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

Beispiel:

# whoami
whoami
whoami: unknown uid 0
2
Smeterlink

Soweit ich weiß, ist der richtige Weg, dies zu überprüfen:

if [ $(id -u) = "0" ]; then
    echo "You are root"
else
    echo "You are NOT root"
fi

Siehe Abschnitt "Testen auf Root" hier:

http://linuxcommand.org/lc3_wss0080.php

2
WebBrother

Suchen Sie nach root und beenden Sie das Programm, wenn dies fehlschlägt:

    func_check_for_root() {
        if [ ! $( id -u ) -eq 0 ]; then
            echo "ERROR: $0 Must be run as root, Script terminating" ;exit 7
        fi
    }
    func_check_for_root

Dann gibt es noch whoami und 'who am i', wenn Sie wissen möchten, wer ein Skript aufgerufen hat und wer gerade ein Skript ausführt:

    [email protected]:~$ who am i
    it       pts/19       2014-06-03 12:39 (:0.0)
    [email protected]:~$ Sudo who am i
    [Sudo] password for it: 
    it       pts/19       2014-06-03 12:39 (:0.0)

(siehe, auch bei Sudo gibt es die Benutzer-ID)

    [email protected]:~$ Sudo whoami
    root

Daher,

    if [ "$(whoami)" == "user" ]; then
                echo "Executing the installer script"

    else
                echo "user is only allowed to execute the installer script"
    fi
1
Mike Q