4 formas de obtener el nombre de usuario de la sesión actual en Linux

Veamos 4 formas diferentes de mostrar el nombre de usuario asociado a la sesión actual desde línea de comandos en Linux y sus diferencias.







Este artículo demuestra diferentes alternativas para determinar el nombre de usuario actual, y entender las diferencias entre nombre de usuario real y efectivo y nombre de login, mediante el uso de las herramientas whoami , id , logname y Bash.

whoami

La herramienta whoami imprime el nombre de usuario asociado al id de usuario efectivo actual:

emi@hal9000:~$ whoami emi

Esta herramienta suele estar presente en todas las distribuciones GNU/Linux ya que es parte del paquete GNU coreutils.

id

El utilitario id permite mostrar los id de usuario y grupo efectivos y reales:

emi@hal9000:~$ id uid=1000(emi) gid=1000(emi) groups=1000(emi),24(cdrom),25(floppy),29(audio),30(dip),44(video),46(plugdev),103(netdev),108(lpadmin),111(scanner)

Cabe destacar que lso id (tanto de usuario como de grupo) efectivos y reales pueden diferir en los casos en los que se lanzan programas que tienen seteados los bits SUID y/o SGID. Lo mismo ocurre cuando se lanzan programas con las herramientas newgrp , sudo o su .

id también es parte del paquete coreutils, y tiene opciones más avanzadas que whoami , como por ejemplo mostrar sólo el id de usuario en formato numérico o el nombre:

emi@hal9000:~$ id -u -n emi emi@hal9000:~$ id -u 1000

Otra herramienta provista por el paquete GNU coreutils es logname . Similar a whoami , permite obtener el nombre de login de la sesión actual:

emi@hal9000:~$ logname emi

Cabe destacar que whoami y logname son herramientas distintas. Esta aclaración vale ya que muchas veces ciertas aplicaciones son enlaces simbólicos o wrappers a otras aplicaciones, y se mantienen por compatibilidad.

A diferencia de whoami , el utilitario logname no muestra el nombre de usuario efectivo, sino que muestra el nombre de usuario con el que se ha logueado, tal como veremos a continuación:

Desde la variable de entorno USER de Bash

La variable de entorno USER de Bash almacena el nombre del usuario con el que se ha iniciado la sesión:

emi@hal9000:~$ echo $USER emi

Notar la definición que he utilizado: "con el que se ha iniciado la sesión". Esto significa que este nombre de usuario puede estar desactualizado, y es el caso en el que se cambia de usuario directamente con su sin cargar el entorno del usuario al que se pasa. Veamos un ejemplo:

emi@hal9000:~$ echo $USER emi emi@hal9000:~$ su root Password:

He pasado al usuario "root" sin cargar el entorno (no he utilizado - o -l ). Esto implica que no se ha cargado el entorno del nuevo usuario, sino que se ha mantenido el entorno actual. Por ende:

root@hal9000:/home/emi# echo $USER emi root@hal9000:/home/emi# id uid=0(root) gid=0(root) groups=0(root)

El nombre de usuario en la variable de entorno USER no coincide con el efectivo (reportado por id ).

Sin embargo, dado que su lanza una subshell (nueva instancia de Bash en u proceso separado), la sesión y el proceso corre a nombre del nuevo usuario:

root@hal9000:/home/emi# ps u $$ USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 9743 0.0 0.0 10024 3964 pts/2 S 11:54 0:00 bash

Veamos que reportan logname y whoami :

root@hal9000:/home/emi# logname emi root@hal9000:/home/emi# whoami root root@hal9000:/home/emi# echo $USER emi

He aquí la diferencia, mientras que whoami muestra el nombre de usuario efectivo, logname muestra el nombre de usuario logueado.

Plot twist

logname tampoco muestra el nombre de usuario efectivo aunque se cambie de usuario con su - (emulando el login). Es posible verificar este comportamiento con el siguiente ejemplo:

emi@hal9000:~$ echo $USER; logname; whoami emi emi emi

Desde el usuario "emi" se pasa a "root" emulando el login (se agrega - ):

emi@hal9000:~$ su - root Password:

Veamos qué reporta logname en comparación a whoami y Bash:

root@hal9000:~# echo $USER; logname; whoami root emi root

Este comportamiento es debido a que logname obtiene el nombre de usuario desde la base de datos /var/run/utmp mantenida a nivel sistema. Misma base de datos que utiliza, por ejemplo, el comando w . Pero la sesión como "root" fue iniciada con su como un login emulado, no un login real (ejecutando login ). Por ente la base de datos /var/run/utmp no se ve afectada:

root@hal9000:~# w 12:28:32 up 5:04, 1 user, load average: 0.18, 0.46, 0.45 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT emi :0.0 :0.0 07:26 ?xdm? 37:01 0.02s /bin/sh /etc/xdg/xfce4/xinitrc -- /etc/X11/xinit/xserverrc

Notar que el nombre de login sigue siendo "emi". Por ello logname reporta "emi". Esta es la diferencia entre nombre de usuario efectivo y nombre de login. El nombre de login es el nombre de usuario con el que se ha autenticado desde la aplicación login , mientras que el nombre de usuario efectivo es el nombre de usuario con el que corre el proceso Bash correspondiente a la sesión actual.

Referencias

GNU Coreutils: logname invocation

man id

man su

man login

man bash



Tal vez pueda interesarte

