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?


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

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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.