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 whoamilugar de simplemente leer cualquiera de estas variables.
environment-variables
tshepang
fuente
fuente

manpágina,whoamiinforma el nombre asociado con su identificación de usuario efectiva. Lo que significa que devolverá algo diferente si está utilizandosudoo ejecutando un ejecutable setuid. Si hasudoconfigurado, intentesudo whoamipor ejemplo.USERyUSERNAMEson 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 whoamiysudo echo $USERsudo 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 elwhoamiuso del EUID , tenga en cuenta quesudo whoamise generarárootincluso si sewhoamiusa el UID.sudoestablece 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 -uasudo 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
USERyUSERNAMEset y su comando sólo devuelveLOGNAME.loginno parece ser el único establecimiento de estas variables.logincomando. 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.loginmuchas veces no se invoca al iniciar sesión en másssho por la mayoría de los administradores de inicio de sesión gráfica.No hay ninguna regla. Algunas conchas gusta
tcshozshconjunto$LOGNAME.zshconjuntos$USER.Puede ser ajustado por algunas cosas que inicie sesión en perfectas
login(como invocada porgettymomento 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,
$USERgeneralmente 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$LOGNAMEse establezca al iniciar sesión (ycron).Para obtener el nombre de inicio de sesión de forma portátil, mejor es utilizar el
lognamecomando (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
loginprograma) sino tambiéncrontrabajos y similares.Por lo tanto, debe saber que POSIX requiere
$LOGNAMEpero 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
whoamiogetpwentygetpwnam) 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