Fordert den Benutzer auf, sich als root anzumelden, wenn ein Shell-Skript ausgeführt wird

17

Das Problem, das ich bekomme, ist, wenn ich den Befehl eingebe,

su - root

Am Anfang meiner Shell-Skriptdatei wird der Benutzer aufgefordert, das Kennwort einzugeben, und der Rest des Shell-Skripts wird NICHT fortgesetzt. Ich muss das Shell-Skript dann manuell über das Terminal suchen und ausführen. Ich möchte, dass das Skript sicherstellt, dass sich der Benutzer als root anmeldet und dann mit dem Rest des Shell-Skripts fortfährt.

Mit anderen Worten, ich möchte das Skript als ein beliebiger Benutzer ausführen, aber sobald das Skript ausgeführt wird, muss der Benutzer zu root wechseln und dann mit dem Rest des Skripts als root fortfahren, bis es fertig ist. Kann das gemacht werden?

Redson
quelle

Antworten:

34

Dies ist sehr einfach zu bewerkstelligen:

#!/bin/sh
[ "$(whoami)" != "root" ] && exec sudo -- "$0" "$@"

Wenn der aktuelle Benutzer nicht root ist, führen Sie das Skript erneut durch sudo.

Beachten Sie, dass ich sudohier anstelle von verwende su. Dies liegt daran, dass Sie Argumente beibehalten können. Wenn Sie verwenden su, müsste Ihr Befehl so lauten su -c "$0 $@", dass Ihre Argumente durch Leerzeichen oder spezielle Shell-Zeichen entstellt werden.

Wenn Ihre Shell bash ist, können Sie den externen Aufruf von whoami:

(( EUID != 0 )) && exec sudo -- "$0" "$@"
Patrick
quelle
Entschuldigung, ich habe in der Erklärung einen Fehler gemacht, der möglicherweise falsch interpretiert wurde. Hier ist eine klarere Erklärung. Danke für die Hilfe!
Redson
@ user68857 Ihre Frage war klar. Diese Antwort macht genau das, was Sie wollen.
Patrick
Ich
bekomme
Ich möchte das Skript als normaler Benutzer über das Terminal ausführen, aber das Skript sollte den Benutzer dann bis zum Ende des Skripts auf root
umstellen
@Nosscire Wenn Sie bekommen sudo: must be setuid root, dann ist etwas mit Ihrem Sudo passiert. Um es zu beheben: chmod u+s $(which sudo). Und ja, ich weiß genau, was Sie versuchen, ich mache die ganze Zeit in meinen Skripten das Gleiche.
Patrick
7

Sie können auch die UID überprüfen:

 if [ $(id -u) != 0 ]; then
     echo "You're not root"
     # elevate script privileges
 fi
Bach
quelle
5

Sie können das Skript selbst aufrufen und Folgendes überprüfen:

#! /bin/bash

if [ "root" != "$USER" ]; then
  su -c "$0" root
  exit
fi

...
Hauke ​​Laging
quelle
0

Fügen Sie an der Stelle, an der Sie sich anmelden möchten, einfach den folgenden Befehl hinzu

sudo su

Dies funktioniert perfekt mit meinem Code

user245333
quelle