Además, ¿estas variables siempre coincidirán con el nombre de usuario actualmente conectado (lo hacen en mi sistema Debian)? ¿Puedo asumir su disponibilidad en otros sistemas Unix (similares)?
También tengo curiosidad de por qué uno usaría en whoami
lugar de simplemente leer cualquiera de estas variables.
environment-variables
tshepang
fuente
fuente
man
página,whoami
informa el nombre asociado con su identificación de usuario efectiva. Lo que significa que devolverá algo diferente si está utilizandosudo
o ejecutando un ejecutable setuid. Si hasudo
configurado, intentesudo whoami
por ejemplo.USER
yUSERNAME
son variables de entorno ordinarias, lo que significa que, si lo desea, puede establecerlas en valores arbitrarios. Solo escribeUSER=xyz
. En otras palabras, incluso si esas variables existen, no hay garantía de que sus valores coincidan con el nombre de usuario actualmente conectado.guarantee
, quise decir por defecto (es decir, suponiendo que el usuario no los cambió).sudo whoami
ysudo echo $USER
sudo echo $USER
, el shell se expande$USER
, luego llamasudo
. Por supuesto, no produce el mismo resultado quewhoami
. Comosudo whoami
,sudo sh -c 'echo $USER'
hace (típicamente) salidaroot
. Con respecto a su comentario sobre elwhoami
uso del EUID , tenga en cuenta quesudo whoami
se generarároot
incluso si sewhoami
usa el UID.sudo
establece tanto EUID como UID para el comando que ejecuta (excepto en la situación muy inusual en la que lo configura explícitamente para que se comporte de otra manera). Compararsudo id -u
asudo id -ru
.Respuestas:
Es iniciar sesión .
La página de manual de inicio de sesión de Linux (1) dice:
La página de manual de inicio de sesión de FreeBSD (1) dice:
Las páginas de manual de NetBSD , OpenBSD y OS X dicen lo mismo.
Aquí está el código fuente del inicio de sesión util-linux:
Aquí está el código fuente del inicio de sesión de FreeBSD:
fuente
USER
yUSERNAME
set y su comando sólo devuelveLOGNAME
.login
no parece ser el único establecimiento de estas variables.login
comando. Sistemas operativos que utilizan Linux como su núcleo son libres de usar cualquier aplicación que les gusta. Por ejemplo sistemas basados en Debian tienden a usar el de shadow-utils, no util-linux.login
muchas veces no se invoca al iniciar sesión en másssh
o por la mayoría de los administradores de inicio de sesión gráfica.No hay ninguna regla. Algunas conchas gusta
tcsh
ozsh
conjunto$LOGNAME
.zsh
conjuntos$USER
.Puede ser ajustado por algunas cosas que inicie sesión en perfectas
login
(como invocada porgetty
momento de la conexión en un terminal y, a veces por otras cosas comoin.rlogind
),cron
,su
,sudo
,sshd
,rshd
, los administradores de inicio de sesión gráfica o no.Sin embargo, si ha habido un inicio de sesión, en mi experiencia,
$USER
generalmente se establece (pero no se puede actualizar después de un cambio de identificación de usuario (a través de comandos setuid) dentro de esa sesión de inicio de sesión. POSIX requiere que$LOGNAME
se establezca al iniciar sesión (ycron
).Para obtener el nombre de inicio de sesión de forma portátil, mejor es utilizar el
logname
comando (si no ha habido ninguna entrada, puede devolver nada). Para obtener el identificador de usuario, utiliceid -u
. Para obtener un nombre de usuario correspondiente a la corriente id de usuario:id -un
. Para obtenerlos todos (la mayoría de las veces, solo hay un nombre de usuario por ID de usuario, pero eso no está garantizado):Aunque eso puede no funcionar en sistemas donde la base de datos de usuarios no se puede enumerar (como sucede a veces con las bases de datos de usuarios en red, por ejemplo).
fuente
Probablemente desee confiar en el estándar POSIX aquí, ya que en algún momento probablemente le interesará no solo el inicio de sesión de usuario (administrado por el
login
programa) sino tambiéncron
trabajos y similares.Por lo tanto, debe saber que POSIX requiere
$LOGNAME
pero no$USER
. Por ejemplo$USER
, no puede establecerlo cron, como se señala en una respuesta de Keith Thompson , que también hace referencia a algunos antecedentes sobre cómo esto se relaciona con la historia de System-V vs BSD:fuente
Si desea utilizar las variables de entorno (en lugar de
whoami
ogetpwent
ygetpwnam
) y no está seguro de si siempre se configuran de la misma manera en todos los sistemas * NIX, intente esto en bash:Si todavía está vacío después de todo eso, entonces estás en un sistema bastante esotérico. ;)
fuente