¿Cómo puedo obtener el nombre de usuario del usuario actual en Bash?


321

Estoy escribiendo un programa en Bash que necesita obtener el nombre de usuario del usuario.

He oído hablar de algo llamado whoami, pero no tengo idea de qué hace o cómo usarlo.

¿Qué comando utilizo para obtener el nombre de usuario actual?


Parece que ninguno de los métodos propuestos hasta ahora funciona sin depender de $ USER o invocar un proceso separado. ¿No hay bash incorporado para obtener el nombre de usuario sin invocar un proceso separado?
ColinM

99
Cuando haya escuchado un comando pero no esté seguro de cómo usarlo, la verificación man whoamisuele ser una buena primera parada para verificar la documentación.
Mark Stosberg

Respuestas:


470

En la línea de comando, ingrese

whoami

o

echo "$USER"

Para guardar estos valores en una variable, haga

myvariable=$(whoami)

o

myvariable=$USER

Por supuesto, no necesita hacer una variable ya que para eso es la $USERvariable.


53
Solo una nota rápida de que $ USER y whoami devuelven valores diferentes si ejecuta un comando a través de ssh como otro usuario. whoami devuelve el usuario del sistema operativo y $ USER devuelve el usuario ssh.
BillMan

44
@BillMan, ¿qué significa eso? Podría dar un ejemplo?
Dejay Clayton

17
En algunos casos, $USERno está configurado en absoluto. Peor aún, es solo una variable de entorno, por lo que puede ser anulada por el usuario:USER=thisisnotmyname bash -c 'echo $USER' # prints thisisnotmyname
sitaktif

1
@sitaktif ¿Qué sugiere como solución a este problema?
SethMMorton

3
@SethMMorton Me doy cuenta de que hice que el problema pareciera peor de lo normal. Sin embargo, para responder la pregunta, el uso whoami(como sugirió) elimina el problema por completo, suponiendo que las variables de entorno anuladas sean un problema potencial en su contexto.
sitaktif

81

Una alternativa a whoamies id -u -n.

id -udevolverá la identificación de usuario (por ejemplo, 0 para root ).


55
A menos que me equivoque, este sería el camino a seguir si la portabilidad es una preocupación, ya que el idcomando -uy las -nbanderas son parte de posix

3
Esta realmente debería ser la respuesta aceptada. "${USER}"y whoamiambos dependen de cómo inicies sesión. Específicamente, los shells de inicio de sesión y sudo establecerán $ USER y whoamimirarán al usuario adjunto a stdin. Sin embargo, si está ejecutando un trabajo por lotes desde cron, o está ejecutando un script de inicio como un usuario diferente al root, entonces estos generarán un usuario incorrecto (root) o nada en absoluto. Esta respuesta devolverá el valor correcto independientemente de la identificación de usuario del proceso.
Asfand Qazi

Esto no es útil si desea el nombre de usuario en lugar de la identificación
Jonathan

3
Si probaste el comando antes de agregar comentarios falsos, verías que el -nargumento imprime el nombre de usuario, al igual que la pregunta original. vea lo siguiente: id -u -nimpresiones brett, incluso en darwin.
Brett

20

Utilice el comando estándar Unix / Linux / BSD / MacOS lognamepara recuperar el usuario conectado. Esto ignora el medio ambiente y el sudo, ya que estos son reporteros poco confiables. Siempre imprimirá el nombre del usuario conectado y luego saldrá. Este comando ha existido desde aproximadamente 1981.

My-Mac:~ devin$ logname
devin
My-Mac:~ devin$ sudo logname
Password:
devin
My-Mac:~ devin$ sudo su -
My-Mac:~ root# logname
devin
My-Mac:~ root# echo $USER
root

17

Un truco que he usado en Solaris 9 y Linux y que funciona bien para ambos:

ps -o user= -p $$ | awk '{print $1}'

Este fragmento imprime el nombre del usuario con el EUID actual.

NOTA: necesita Bash como intérprete aquí.

En Solaris tiene problemas con los métodos, descritos anteriormente:

  • idno acepta los parámetros -uy -n(por lo que tendrá que analizar la salida)
  • whoami no existe (por defecto)
  • who am I imprime el propietario del terminal actual (ignora EUID)
  • $USERLa variable se establece correctamente solo después de leer los archivos de perfil (por ejemplo, /etc/profile)

1
¿Por qué necesitas bash como intérprete? Nada en la línea de comando que se muestra parece ser específico de ningún shell. De hecho, ¿por qué incluso incluir la tubería a través de awk? Por lo que puedo decir, su pscomando es todo lo necesario para mostrar al propietario del pid del shell actual.
ghoti

Para nosotros, como humanos, ignorar la información superflua es natural. La parte awk aísla los datos deseados, para variables o en general la computadora que aún no puede hacer suposiciones sobre la marcha en este nivel rudimentario.
BradChesney79

En Solaris, use command -p id(desde un shell POSIX) o /usr/xpg4/bin/id. En términos más generales, en Solaris, desearía modificar su entorno para PATH=ubicarse en un entorno POSIX (con algo como getconf PATH` y asegúrese de ejecutarlo /usr/xpg4/bin/sh) para evitar quedarse atascado con comandos de los años 70/80.
Stephane Chazelas

'ps: opción desconocida - o'
Anand Rockzz

12

Dos comandos:

  1. id imprime la identificación de usuario junto con los grupos. Formato:uid=usernumber(username) ...

  2. whoami da el nombre de usuario actual


1
$ whoami no está disponible como variable en bash. ¡Necesita hacer $ (whoami) o `whoami` para ejecutar realmente el comando whoami!
Rudolf Mayer

@RudolfMayer lo arreglé
wjandrea

6

Cuando se requieren permisos de root (sudo), que generalmente son 90% + cuando se usan scripts, los métodos en las respuestas anteriores siempre le dan rootla respuesta.

Obtener el usuario actual "conectado" es igual de simple, pero requiere acceder a diferentes variables: $SUDO_UIDy $SUDO_USER.

Pueden hacerse eco:

echo $SUDO_UID
echo $SUDO_USER

O asignado, por ejemplo:

myuid=$SUDO_UID
myuname=$SUDO_USER

6

En Solaris OS utilicé este comando:

$ who am i     # Remember to use it with space.

En Linux: alguien ya respondió esto en los comentarios.

$ whoami       # Without space

5

Para Bash , KornShell ( ksh), shetc. Muchas de sus preguntas son respondidas rápidamente por:

man [function]

para obtener la documentación del sistema que está utilizando o, por lo general, más convenientemente:

google "función man"

Esto puede dar resultados diferentes para algunas cosas donde Linux y Unix tienen diferencias modestas.

Para esta pregunta, simplemente ingrese "whoami" en su caparazón.

Para escribirlo:

myvar=$(whoami)

2

El nombre de usuario del usuario actual se puede obtener en Bash puro con la ${parameter@operator}expansión de parámetros (introducida en Bash 4.4):

$ : \\u
$ printf '%s\n' "${_@P}"

El :incorporado (sinónimo de true) se usa en lugar de una variable temporal estableciendo el último argumento, que se almacena en $_. Luego lo expandimos ( \u) como si fuera una cadena de solicitud con el Poperador.

Esto es mejor que usar $USER, ya que $USERes solo una variable ambiental regular; puede modificarse, desarmarse, etc. Incluso si no se manipula intencionalmente, un caso común en el que todavía es incorrecto es cuando el usuario cambia sin iniciar un shell de inicio de sesión ( supredeterminado).


1

En la mayoría de los sistemas Linux, simplemente escribiendo whoami en la línea de comando proporciona la ID de usuario.

Sin embargo, en Solaris, es posible que deba determinar la ID de usuario, determinando el UID del usuario que inició sesión a través del siguiente comando.

echo $UID

Una vez que se conoce el UID, encuentre al usuario haciendo coincidir el UID con el /etc/passwdarchivo.

cat /etc/passwd | cut -d":" -f1,3

cat / etc / passwd | corte -d ":" -f1,3 | grep $ UID | cut -d ":" -f1
Andrew Taylor

-4

Obtener la estructura de usuario de la tarea actual

#define get_current_user()              \
({                                      \
    struct user_struct *__u;            \
    const struct cred *__cred;          \
    __cred = current_cred();            \
    __u = get_uid(__cred->user);        \
    __u;                                \
})

2
La pregunta era sobre cómo obtener el nombre de usuario dentro de un script bash. Esta respuesta trata sobre cómo obtener la ID de usuario numérica (no el nombre de usuario) del código C que se ejecuta dentro del kernel de Linux (como un módulo de kernel de Linux personalizado). No es una respuesta a la pregunta que se hizo, es una respuesta a una pregunta diferente.
Simon Kissane
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.