¿Cómo obtener el nombre del usuario que ejecutó un script bash como sudo?

17

Quiero crear una secuencia de comandos bash que debe ejecutarse con sudo pero debe tener en cuenta el nombre del usuario que no lo hizo. Entonces, si el usuario bobejecuta, sudo ./myscript.shme gustaría myscript.shsaber quién bobfue el que lo ejecutó.

Miremos adentro myscript.sh:

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

¿Cómo puedo saber el nombre del usuario que generó el proceso? Más específicamente, ¿qué debo usar en lugar de whoamipara obtener boby no root?

marcio
fuente
Ese no es un guión válido, creo que quisiste decir USER=$(whoami). Tenga en cuenta que USERya existe como una variable interna de shell. Además, si se trata de un script bash, no lo ejecute utilizando sh, que solo tiene un subconjunto de características compatibles con POSIX.
nyuszika7h
¿Por qué no editar? arreglado ahora.
marcio
Es demasiado trivial, las ediciones deben tener al menos 6 caracteres, al menos sugeridos.
nyuszika7h
vale, entiendo. Gracias por los consejos: DI generalmente pone un hashbang como este #!/usr/bin/env bashen mis scripts de bash.
marcio
El hashbang se ignora si lo llamas explícitamente con shu otra cosa.
nyuszika7h

Respuestas:

28

No estoy seguro de qué tan estándar es, pero al menos en los sistemas Ubuntu sudoestablece las siguientes variables de entorno (entre otras, consulte la ENVIRONMENTsección de la página de manual de 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

por ejemplo,

steeldriver@lap-t61p:~$ sudo sh -c 'whoami'
root
steeldriver@lap-t61p:~$ sudo sh -c 'echo $SUDO_USER'
steeldriver
conductor de acero
fuente
Funciona como se esperaba en todas las plataformas que probé: debian, fedora (redhat) y freebsd. ¡Gracias!
marcio
Confirmado trabajando en una Mac.
SiKing
Funciona en ubuntu también.
Andi Jay
9

Si también quieres que funcione sin él sudo, úsalo ${SUDO_USER:-$USER}. Por ejemplo:

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

Explicación

${var:-val}se expandirá a $var, a menos que esté desarmado o vacío, en cuyo caso se expandirá a val.

nyuszika7h
fuente