Wie erhalte ich den Namen des Benutzers, der ein Bash-Skript als sudo ausgeführt hat?

17

Ich möchte ein Bash-Skript erstellen, das mit sudo ausgeführt werden muss, aber den Namen des Nicht-sudo-Benutzers berücksichtigen soll, der es ausgeführt hat. Also, wenn der Benutzer bobläuft, sudo ./myscript.shwürde ich gerne myscript.shwissen, bobwer es ausgeführt hat.

Schauen wir mal rein myscript.sh:

USER=$(whoami)
# Do something that takes into account the username.

Wie kann ich den Namen des Benutzers erfahren, der den Prozess ausgelöst hat? Genauer gesagt, was soll ich verwenden, anstatt whoamizu bekommen bobund nicht root?

marcio
quelle
Das ist kein gültiges Skript, glaube ich USER=$(whoami). Beachten Sie, dass die USERbereits als Shell-interne Variable existiert. Wenn es sich um ein Bash-Skript handelt, sollten Sie es nicht mit ausführen, da es shnur eine POSIX-kompatible Teilmenge von Funktionen enthält.
nyuszika7h
warum nicht bearbeiten? jetzt behoben.
Marcio
Es ist zu trivial, Änderungen müssen aus mindestens 6 Zeichen bestehen, zumindest aus vorgeschlagenen.
Nyuszika7h
OK ich verstehe. Vielen Dank für die Tipps: Normalerweise hat DI #!/usr/bin/env bashmeinen Bash-Skripten einen solchen Hashbang hinzugefügt .
Marcio
Der Hashbang wird ignoriert, wenn Sie ihn explizit mit shoder etwas anderem aufrufen .
nyuszika7h

Antworten:

28

Ich bin mir nicht sicher, wie Standard es ist, aber zumindest in Ubuntu-Systemen sudowerden die folgenden Umgebungsvariablen gesetzt (unter anderem - siehe ENVIRONMENTAbschnitt der sudo-Manpage):

   SUDO_UID        Set to the user ID of the user who invoked sudo

   SUDO_USER       Set to the login of the user who invoked sudo

beispielsweise,

steeldriver@lap-t61p:~$ sudo sh -c 'whoami'
root
steeldriver@lap-t61p:~$ sudo sh -c 'echo $SUDO_USER'
steeldriver
Stahlfahrer
quelle
Funktioniert erwartungsgemäß auf allen Plattformen, die ich getestet habe: Debian, Fedora (RedHat) und Freebsd. Vielen Dank!
Marcio
Bestätigt das Arbeiten auf einem Mac.
SiKing
Funktioniert auch auf Ubuntu.
Andi Jay
9

Wenn Sie möchten, dass es auch ohne funktioniert sudo, verwenden Sie ${SUDO_USER:-$USER}. Beispielsweise:

printf '%s\n' "${SUDO_USER:-$USER}"

Erläuterung

${var:-val}wird auf erweitert $var, es sei denn, es ist nicht gesetzt oder leer. In diesem Fall wird auf erweitert val.

nyuszika7h
quelle