¿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?


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

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.