Identificar al usuario en un script Bash llamado por sudo


108

Si creo el script que /root/bin/whoami.shcontiene:

#!/bin/bash
whoami

y este script es llamado por un usuario con un sudo configurado correctamente, indicará

root

¿Existe una forma rápida de obtener el usuario real en un script, o tendré que recurrir a parámetros que pasan junto a este nombre de usuario?

Respuestas:


134

$ SUDO_USER no funciona si está usando sudo su -.
También requiere varias comprobaciones, si es que $USER == 'root'se obtiene $SUDO_USER.

En lugar del comando whoamiuse who am i. Esto ejecuta el whocomando filtrado para la sesión actual. Te da más información de la que necesitas. Entonces, haz esto para obtener solo el usuario:

who am i | awk '{print $1}'

Alternativamente (y más simple) puede usar logname. Hace lo mismo que la declaración anterior.

Esto le da el nombre de usuario que inició sesión en la sesión.

Estos funcionan independientemente de sudoo sudo su [whatever]. También funciona independientemente de cuántas veces suy sudose llamen.


2
Sí, +1, who am ies la respuesta aquí.
Joe Kearney

43
Alternativa a who am ies who mom likes. Tu elección.
wchargin

3
whodevuelve 2 líneas para mí, ambas contienen mi nombre, y who am ino devuelve ninguna. ¿Alguna ayuda?
Hosh Sadiq

7
Estoy en Ubuntu 16.04 y el comando who am ino hace nada, parece ser simple who, por lo que who | awk '{print $1}'funciona como se esperaba;)
daveoncode

1
En caso de que no lo haya awkinstalado, también puede usar cut: who mom likes | cut -d' ' -f1 o sedpor alguna razón: who mom likes | sed -n 's/^\([^ ]*\).*/\1/p'
Yzmir Ramirez

56

Creo que $ SUDO_USER es válido.

#!/bin/bash
echo $SUDO_USER
whoami

1
Cosa extraña: sudo envmuestra SUDO_USERpero sudo echo $SUDO_USERno imprime nada ...
Trabajo

17
trabajo, esto no es extraño, se espera. en sudo echo $SUDO_USER, bash está evaluando $ SUDO_USER antes de ejecutar sudo. pruebe el script publicado en esta solución, funciona.

@quadmore: Si está satisfecho con la respuesta, no olvide aceptarla.
Trabajo

2
También puede utilizar echo ${SUDO_USER:-$USER}para detectar la sudoejecución de ambos y no sudo. Pero la respuesta de evan logname suena más fácil
Tobias Kienzler

2
@TobiasKienzler - Y como señala evan, $SUDO_USERno funciona con sudo su -, pero lognamesiempre funciona.
David Harkness

13

A continuación se explica cómo obtener el nombre de usuario de la persona que llamó al script, sin importar si es sudo o no:

if [ $SUDO_USER ]; then user=$SUDO_USER; else user=`whoami`; fi

o una versión más corta

[ $SUDO_USER ] && user=$SUDO_USER || user=`whoami`

8
aún más corto: user=${SUDO_USER:-$(whoami)}ouser=$(logname)
Tobias Kienzler

3

who am i | awk '{print $1}'no funcionó para mí pero who|awk '{print $1}'servirá el trabajo


1
No en un host donde más de un usuario tiene sesión
Roman Grazhdan


1

Utilizando whoami, who am i, who, ido $SUDO_USERno está bien aquí.

En realidad, whonunca es una solución a la pregunta, ya que solo enumerará los usuarios que iniciaron sesión, que pueden ser docenas ...

En mi opinión, la única respuesta valiosa es el uso de logname.

Espero que esto ayude

Robar


0

Si es el UID que está buscando (útil para travesuras de Docker), entonces esto funciona:

LOCAL_USER_ID=$(id -u $(logname))
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.