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
- GNU Coreutils: logname invocation
man id
man su
man login
man bash