Ich schreibe ein Skript, für das Berechtigungen auf Stammebene erforderlich sind, und ich möchte es so gestalten, dass, wenn das Skript nicht als root ausgeführt wird, einfach "Bitte als root ausführen" angezeigt wird. und geht.
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 könnte ich dies am besten (sauber und sicher) erreichen? Vielen Dank!
Ah, nur um zu verdeutlichen: Der (do stuff) Teil würde das Ausführen von Befehlen beinhalten, die an und für sich root erfordern. Wenn Sie es also als normaler Benutzer ausführen, wird nur ein Fehler angezeigt. Dies ist nur dazu gedacht, ein Skript sauber auszuführen, für das Root-Befehle erforderlich sind, ohne dass sudo im Skript verwendet wird. Ich suche nur nach syntaktischem Zucker.
id -u
gibt0
für root zurück.Antworten:
Die Umgebungsvariable $ EUID enthält die UID des aktuellen Benutzers. Die UID von Root ist 0. Verwenden Sie in Ihrem Skript Folgendes:
Hinweis: Wenn Sie erhalten,
2: [: Illegal number:
überprüfen Sie, ob Sie#!/bin/sh
oben haben, und ändern Sie es in#!/bin/bash
.quelle
2: [: Illegal number:
gewarnt, bis ich es auf Sergios Version änderte.then
in der gleichen Zeile wie die Bedingung ist ...In einem Bash-Skript haben Sie verschiedene Möglichkeiten, um zu überprüfen, ob der laufende Benutzer root ist.
Überprüfen Sie als Warnung nicht, ob ein Benutzer root ist, indem Sie den
root
Benutzernamen verwenden. Nichts garantiert, dass der Benutzer mit der ID 0 angerufen wirdroot
. Es ist eine sehr starke Konvention, die weitgehend befolgt wird, aber jeder kann den Superuser in einen anderen Namen umbenennen.Ich denke, der beste Weg, wenn Sie Bash verwenden, ist die Verwendung
$EUID
von der Manpage:Dies ist ein besserer Weg als
$UID
der, der geändert werden könnte und nicht den tatsächlichen Benutzer widerspiegelt, der das Skript ausführt.Ein Weg, wie ich mich dieser Art von Problem nähere, besteht
sudo
darin, meine Befehle einzufügen, wenn sie nicht als root ausgeführt werden. Hier ist ein Beispiel: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, legen Sie einfach die entsprechenden Rechte fest (
0500
).quelle
printf $EUID
mit oder ohne sudo bin, bekomme ich meine eigene UID zurück. Wenn ich benutze,id -u
bekomme ich meine UID und wenn ich sie mit sudo aufrufe, bekomme ich 0 zurück. Habe ich etwas falsch gemacht?sudo bash <<<'echo $EUID'
mitbash <<<'echo $EUID'
. Mehr über den Heredoc-ähnlichen Herestring unter tldp.org/LDP/abs/html/x17837.htmlEs wurden einige Antworten gegeben, aber es scheint, dass die beste Methode darin besteht, Folgendes zu verwenden:
id -u
Dies scheint zuverlässiger zu sein als die anderen Methoden, und es scheint, dass es eine ID von 0 zurückgibt, selbst wenn das Skript ausgeführt wird
sudo
.quelle
oder
:) :)
quelle
sudo
einfach tippen kannsudo !!
und es die Arbeit für mich erledigt, anstatt den Aufwärtspfeil zu drücken, zum Zeilenanfang zu gehen undsudo
von Hand hinzuzufügen . Ich bin mir nicht sicher, ob das eine BASH-Sache oder eine SUDO-Sache ist, aber es funktioniert fast immer.if [ "$(id -u)" -ne 0 ]; then echo 'Please run as root.' >&2; exit 1; fi
. Prost.Wie @wrikken in seinen Kommentaren erwähnt hat,
id -u
ist eine viel bessere Überprüfung auf root.Darüber hinaus können Sie bei ordnungsgemäßer Verwendung von
sudo
das Skript überprüfen lassen, ob es als Root ausgeführt wird. Wenn nicht, lassen Sie es sich über zurückrufensudo
und dann mit Root-Berechtigungen ausführen.Je nachdem, was das Skript tut, besteht eine andere Möglichkeit darin, einen
sudo
Eintrag für die speziellen Befehle einzurichten, die das Skript möglicherweise benötigt.quelle
$0
den Namen des laufenden Skripts. Es gibt einige Beispiele hier , die Ihnen helfen können.Es gibt eine einfache Überprüfung, ob ein Benutzer root ist.
Die
[[ stuff ]]
Syntax ist die Standardmethode zum Ausführen einer Check-in-Bash.Dies setzt auch voraus, dass Sie mit einer 1 beenden möchten, wenn Sie fehlschlagen. Die
error
Funktion ist ein Flair, das den Ausgabetext auf Rot setzt (nicht erforderlich, aber ziemlich edel, wenn Sie mich fragen).quelle
error
Befehl? Mein System scheint es nicht zu haben. . .less
Stellen Sie die Farbe nur ein, wenn der Standardfehler ein Terminal ist (anstatt das Risiko einzugehen , Escape-Zeichen in Protokolldateien oder so weiter zu schreiben). und (4) eine Hintergrundfarbe einstellen, so dass der Text unabhängig von der Hintergrundfarbe des Benutzerterminals lesbar ist. Also so etwas wiefunction error () { if [[ -t 2 ]] ; then echo $'\033[31;2;47m'"$@"$'\033[0m' ; else echo "$@" ; fi >&2 ; }
. (Wie gewünscht anpassen.)Sehr einfach ausgedrückt:
Der Vorteil dieser Funktion
id
besteht darin, dass Sie überprüfen können, ob ein bestimmter Nicht-Root-Benutzer den Befehl ebenfalls ausführt. z.B.quelle
whoami
anstatt zu verwendenid
; Derwhoami
Befehl kann auch verwendet werden, um nach anderen Benutzern als root nach Namen zu suchen .0- Lesen Sie die offizielle GNU Linux-Dokumentation. Es gibt viele Möglichkeiten, dies richtig zu machen.
1- Stellen Sie sicher, dass Sie die Shell-Signatur eingeben, um Interpretationsfehler zu vermeiden:
2- das ist mein Skript
quelle
In dieser Antwort sei klar, ich gehe davon aus, dass der Leser POSIX- Shell-Skripte lesen
bash
und mögen kann .dash
Ich glaube, hier gibt es nicht viel zu erklären, da die hoch bewerteten Antworten viel davon gut erklären.
Wenn es jedoch noch etwas zu erklären gibt, zögern Sie nicht zu kommentieren, ich werde mein Bestes tun, um die Lücken zu schließen.
Optimierte Allround-
Lösung (nicht nur ) für Leistung und Zuverlässigkeit; Alle Muscheln kompatibelbash
Neue Lösung:
Benchmark (in Datei speichern
is_user_root__benchmark
)Ursprüngliche Lösung:
^^^ Es hat sich gezeigt, dass die durchgestrichene Lösung die Dinge nicht beschleunigt, aber es gibt sie schon lange, also werde ich sie hier behalten, solange ich es für notwendig halte.
Erläuterung
Da das Lesen der
$EUID
Standardvariablenbash
, der effektiven Benutzer-ID-Nummer, um ein Vielfaches schneller ist als das Ausführen einesid -u
Befehls zum POSIX- Finden der Benutzer-ID, kombiniert diese Lösung beides zu einer gut gepackten Funktion. Wenn und nur wenn der$EUID
aus irgendeinem Grund nicht verfügbar ist, wird derid -u
Befehl ausgeführt, um sicherzustellen, dass wir unabhängig von den Umständen den richtigen Rückgabewert erhalten .Warum ich diese Lösung nach so vielen Jahren poste, hat das OP gefragt
Nun, wenn ich richtig sehe, scheint oben ein fehlender Code zu fehlen.
Sie sehen, es gibt viele Variablen, die berücksichtigt werden müssen, und eine davon ist die Kombination von Leistung und Zuverlässigkeit .
Tragbare POSIX- Lösung + Beispiel für die Verwendung der oben genannten Funktion
Fazit
So sehr es Ihnen auch nicht gefällt, die Unix / Linux-Umgebung hat sich stark verändert. Das heißt, es gibt Leute, die
bash
so sehr 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.quelle
Wenn das Skript wirklich Root-Zugriff erfordert, sollten seine Dateiberechtigungen dies widerspiegeln. Ein Root-Skript, das von Nicht-Root-Benutzern ausgeführt werden kann, wäre eine rote Fahne. Ich ermutige Sie, den Zugang nicht mit einem
if
Scheck zu kontrollieren.quelle
777
Bombe diese Überprüfung für die Art von Benutzern, die den Fehler überhaupt machen würden, ein wenig fehlerhaft macht.bash /path/to/script
, kann es trotzdem ausgeführt werdeno=r
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
quelle
exit
? Und immer noch werden diese Antworten positiv bewertet? Ich denke, die Leute wollen implizit nicht, dass das Skript als root ausgeführt wird. Ich folge dieser Denkweise mit einer einfacheren Antwort. Aber ja, Sie können auch aus den ausführlicheren Antworten oben lernenVersuchen Sie den folgenden Code:
ODER
quelle
Soweit ich weiß, ist der richtige Weg, dies zu überprüfen ,:
Siehe Abschnitt "Testen auf Root" hier:
http://linuxcommand.org/lc3_wss0080.php
quelle
= "0"
durch-eq 0
id -u
ist viel besser alswhoami
, da einige Systeme wie Android möglicherweise nicht das Wort root liefern.Beispiel:
quelle
Anmerkung des Herausgebers: Wenn Sie keine doppelten Klammern benötigen, verwenden Sie für die Code-Portabilität einzelne.
quelle
Überprüfen Sie, ob Sie root sind, und beenden Sie, wenn Sie nicht:
Versuchen Sie in diesem Beispiel, ein Verzeichnis im Stammverzeichnis zu erstellen, und versuchen Sie es dann, nachdem die Rechte erhöht wurden.
Überprüfen Sie, ob Sie root sind und wenn nicht, wenn möglich:
quelle
Auf root prüfen:
Getestet und läuft in root.
quelle