Jak uzyskać nazwę użytkownika, który wykonał skrypt bash jako sudo?

17

Chcę utworzyć skrypt bash, który musi zostać wykonany za pomocą sudo, ale powinien uwzględniać nazwę użytkownika niebędącego sudo, który go wykonał. Więc jeśli użytkownik boburuchomi sudo ./myscript.sh, chciałbym myscript.shwiedzieć, że bobto on go wykonał.

Zajrzyjmy do środka myscript.sh:

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

Jak poznać nazwę użytkownika, który utworzył proces? Mówiąc dokładniej, czego powinienem użyć zamiast, whoamiaby dostać, boba nie root?

marcio
źródło
To nie jest poprawny skrypt, myślę, że miałeś na myśli USER=$(whoami). Zauważ, że USERjuż istnieje jako wewnętrzna zmienna powłoki. Ponadto, jeśli jest to skrypt bash, nie uruchamiaj go przy użyciu sh, który ma tylko podzbiór funkcji zgodny z POSIX.
nyuszika7h
dlaczego nie edytować? naprawione teraz.
marcio
Jest to zbyt trywialne, zmiany muszą mieć co najmniej 6 znaków, a przynajmniej sugerowane.
nyuszika7h
dobrze, rozumiem. Dzięki za wskazówki: DI zwykle umieszczam taki hashbang #!/usr/bin/env bashna moich skryptach bash.
marcio
Hashbang jest ignorowany, jeśli wywołujesz go jawnie za pomocą shlub czegoś innego.
nyuszika7h

Odpowiedzi:

28

Nie jestem pewien, jak jest to standard, ale przynajmniej w systemach Ubuntu sudoustawia następujące zmienne środowiskowe (między innymi - patrz ENVIRONMENTsekcja strony podręcznika sudo):

   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

na przykład,

steeldriver@lap-t61p:~$ sudo sh -c 'whoami'
root
steeldriver@lap-t61p:~$ sudo sh -c 'echo $SUDO_USER'
steeldriver
steeldriver
źródło
Działa zgodnie z oczekiwaniami na wszystkich testowanych platformach: debian, fedora (redhat) i freebsd. Dzięki!
marcio
Potwierdzono pracę na komputerze Mac.
SiKing
Działa również na Ubuntu.
Andi Jay
9

Jeśli chcesz, aby działał również bez sudo, użyj ${SUDO_USER:-$USER}. Na przykład:

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

Wyjaśnienie

${var:-val}rozwinie się do $var, chyba że jest rozbrojony lub pusty, w którym to przypadku będzie rozwinięty do val.

nyuszika7h
źródło