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?

quadmore
fuente

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.

evan
fuente
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
Brandon Horsley
fuente
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`
Alexei Tenitski
fuente
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

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

Curioso, el sistema distingue entre UID reales y efectivos , pero no puedo encontrar ningún programa que exporte esto a nivel de shell.

msw
fuente
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

Robar
fuente
0

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

LOCAL_USER_ID=$(id -u $(logname))
Jim Hunziker
fuente