Ich schreibe ein einfaches Bash-Skript, aber ich muss überprüfen, ob es als root ausgeführt wird oder nicht. Ich weiß, dass es wahrscheinlich einen sehr einfachen Weg gibt, aber ich habe keine Ahnung, wie.
Nur um klar zu sein:
Was ist eine einfache Möglichkeit , ein Skript zu schreiben foo.sh , so dass die ./foo.sh
Befehlsausgänge 0
und die sudo ./foo.sh
Befehlsausgänge 1
?
$UID
und$EUID
sind Bashismen. Lediglich POSIX-kompatible Shells haben diese Variablen nicht und müssenid(1)
stattdessen verwendet werden.if ((EUID)); then
, siehe @ geirha Kommentarsudo
. Wenn Sie ausführensudo sh -c 'echo $EUID'
, werden Sie Ihre erwarteten Ergebnisse sehen.$EUID
Ist ein Bashismus (wie oben von @DavidFoerster erwähnt), und dein/bin/sh
ist höchstwahrscheinlich ein Link zu/bin/dash
, nicht/bin/bash
.sudo bash -c 'echo $EUID'
wird das erwartete Ergebnis liefern.Ein root-Benutzer muss nicht "root" genannt werden.
whoami
Gibt den ersten Benutzernamen mit der Benutzer-ID zurück0
.$USER
Enthält den Namen des angemeldeten Benutzers, der eine Benutzer-ID0
, aber einen anderen Namen haben kann.Das einzige zuverlässige Programm, mit dem überprüft werden kann, ob das Konto als root angemeldet ist oder nicht:
Ich benutze
-u
für die effektive Benutzer-ID, nicht-r
für die echte Benutzer-ID. Berechtigungen werden bestimmt durch den effektiven Benutzer - ID, nicht die realen ein.Tests
/etc/passwd
enthält die folgenden Benutzernamen mit der Benutzer-ID0
in der angegebenen Reihenfolge:Angemeldet als
root2
, gibt die nächsten Ergebnisse:whoami
:rootx
echo $USER
:root2
(Dies gibt eine leere Zeichenkette zurück, wenn das Programm in einer leeren Umgebung gestartet wurde, zBenv -i sh -c 'echo $USER'
)id -u
:0
Wie Sie sehen können, sind die anderen Programme bei dieser Prüfung gescheitert, nurid -u
bestanden.Das aktualisierte Skript würde folgendermaßen aussehen:
quelle
id -u
in bash askubuntu.com/questions/30148/…sh
(dash
) anstelle von als Interpreter verwendebash
. Aber guter Schuss, spart eine andere Gabel :)[ -w / ]
. Die Idee bleibt gleich. Hinweis: In bestimmten Chroots schlägt dies[ -w /etc/shadow ]
fehl, da dies/etc/shadow
nicht vorhanden ist. Daher wird der Ansatz mit/
bevorzugt. Besser wäre es, den tatsächlichen Bedarf an Root-Berechtigungen zu prüfen. Wenn das Skript schreiben muss/etc/someconfig
, überprüfen Sie einfach, ob diese Datei beschreibbar ist, ODER ob die Datei nicht vorhanden und/etc
beschreibbar ist.Wie @Lekensteyn sagte , sollten Sie eine effektive Benutzer-ID verwenden. Sie müssen nicht
id -u
bash anrufen :@ geirhas Vorschlag aus den Kommentaren verwendet eine arithmetische Auswertung:
quelle
((..))
zum Testen von Zahlen und[[..]]
zum Testen von Zeichenfolgen und Dateien verwenden, also würde ich esif (( EUID != 0 )); then
stattdessen tun , oder einfachif ((EUID)); then
EUID
sollte werden$EUID
. Anstelle der Verwendung von(( $EUID != 0 ))
verwenden[ $EUID != 0 ]
. Es wird auch funktionierendash
.EUID
funktioniert gut. Die Frage istbash
nicht markiertdash
. Der Befehlenv -i sh -c '[ $EUID != 0 ]'
schlägt fehl,env -i bash -c '(( EUID != 0 ))'
funktioniert aber . Übrigens,dash
funktioniert nicht bei einigen Nicht-ASCII-Zeichen unter Ubuntu stackoverflow.com/questions/5160125/… Es ist 2011 und es gibt Leute, die andere Sprachen verwenden.$EUID
Material von diesem Punkt an anwenden. Ich habe die akzeptierte Antwort daraufhin geändert.Dies erreichen Sie mit dem
whoami
Befehl, der den aktuellen Benutzer zurückgibt:You must be root to do this.
Wenn der aktuelle Benutzer dies nicht tut, wird der obige Befehl gedrucktroot
.Hinweis: In einigen Fällen können Sie auch einfach die
$USER
Variable überprüfen :quelle
$USER
, vor allem auf diese Weise.$USER
wird von der Login-Shell gesetzt, es ist keine Weitergabe an das Programm (env -i sh -c 'echo $USER'
) erforderlich . Auf diese Weise$USER
ist leer und es tritt ein Syntaxfehler auf.$USER
von der Shell festgelegt, sondern ist auch leicht zu fälschen. Whoami gibt den tatsächlichen Benutzer zurück.$USER
von Ihrer Shell interpretiert, sollte Ihr Beispielsudo sh -c 'echo $USER'
sinnvoll sein. @ George: Es wird die falsche Annahme gemacht, dasswhoami
immerroot
für UID 0 zurückgegeben wird.Unter Berücksichtigung der Effizienz können Sie zuerst die
EUID
Umgebungsvariable testen und dann, falls sie nicht vorhanden ist, den Standardbefehl aufrufenid
:Auf diese Weise vermeiden Sie aufgrund der ODER-Verknüpfung , dass Sie einen Systembefehl aufrufen und der Abfrage einer speicherinternen Variablen Priorität einräumen.
Wiederverwendung von Code:
quelle
id -u
. Sehen Sie sich die Bank Skript zusammen mit den Ergebnissen darunter hier: pastebin.com/srC3LWQyquelle
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
quelle
Dieses Snippet würde:
sudo !!
quelle
Diese Antwort dient nur zum Speichern einer Idee und kann für einige von Ihnen hilfreich sein. Wenn Sie ein Skript benötigen, das von der Desktop-GUI ausgeführt wird und Root-Rechte erfordert, gehen Sie folgendermaßen vor:
Auf diese Weise erhalten Sie ein nettes Dialogfenster, in dem Sie nach dem Kennwort des Root-Benutzers gefragt werden. Genau wie bei Kommandozeilen-Sudo.
Das ist
gksudo
möglicherweise nicht in Ihrem System verfügbar, dann installieren Sie es mitsudo apt-get install gksu
.quelle
Dieser Code funktioniert sowohl unter Bash als auch unter Stock Bourne sh (getestet unter FreeBSD), das keine EUID definiert. Wenn die EUID existiert, wird ihr Wert zurückgegeben, andernfalls wird der Befehl 'id' ausgeführt. Es ist ein bisschen kürzer als das obige "oder" Beispiel, da es eine eingebaute Shell ": -" verwendet.
Wurzel in sh:
quelle