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

logname

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


Tal vez pueda interesarte


Compartí este artículo