Chi imposta le variabili di ambiente $ USER e $ USERNAME?


34

Inoltre, queste variabili corrisponderanno sempre al nome utente attualmente connesso (lo fanno sul mio sistema Debian)? Posso assumere la loro disponibilità in altri sistemi Unix (simili)?

Sono anche curioso di sapere perché si dovrebbe usare whoamiinvece di leggere una qualsiasi di queste variabili.


2
Guardando la manpagina, whoamiriporta il nome associato al tuo ID utente effettivo. Ciò significa che restituirà qualcosa di diverso se si utilizza sudoo si esegue un eseguibile setuid. Se hai sudoimpostato, prova sudo whoamiad esempio.
Joseph R.

4
USERe USERNAMEsono normali variabili di ambiente, il che significa che, se lo si desidera, è possibile impostarle su valori arbitrari. Basta digitare USER=xyz. In altre parole, anche se tali variabili esistono, non vi è alcuna garanzia che i loro valori corrispondano al nome utente attualmente connesso.
Uwe,

@Uwe By guarantee, intendevo per impostazione predefinita (ovvero supponendo che l'utente non li abbia modificati).
Tshepang,

2
@Tshepang A seguito del mio primo commento: confronta i risultati di sudo whoamiesudo echo $USER
Joseph R.,

2
@JosephR. Per sudo echo $USER, la shell si espande $USER, quindi chiama sudo. Quindi ovviamente non produce lo stesso output di whoami. Come sudo whoami, sudo sh -c 'echo $USER'fa (tipicamente) output root. Per quanto riguarda il tuo commento whoamisull'utilizzo dell'EUID , nota che sudo whoamiverrebbe prodotto rootanche se whoamiutilizzato l'UID. sudoimposta sia EUID che UID per il comando che esegue (tranne nella situazione molto insolita in cui lo si configura esplicitamente per comportarsi diversamente). Confronta sudo id -ucon sudo id -ru.
Eliah Kagan,

Risposte:


29

È il login .

La pagina man di login (1) di Linux dice:

Il valore per $ HOME , $ USER , $ SHELL , $ PATH , $ LOGNAME e $ MAIL sono impostati in base ai campi appropriati nella voce della password.

La pagina man login (1) di FreeBSD dice:

L' utilità di accesso inserisce informazioni nell'ambiente (vedere environment ( 7) ) specificando la home directory dell'utente (HOME), l'interprete dei comandi (SHELL), il percorso di ricerca (PATH), il tipo di terminale (TERM) e il nome utente (sia LOGNAME che USER) .

Le pagine man di NetBSD , OpenBSD e OS X dicono la stessa cosa.

Ecco il codice sorgente dal login util-linux:

setenv("HOME", pwd->pw_dir, 0); /* legal to override */
setenv("USER", pwd->pw_name, 1);
setenv("SHELL", pwd->pw_shell, 1);
/* ... */
setenv("LOGNAME", pwd->pw_name, 1);

Ecco il codice sorgente dal login di FreeBSD:

(void)setenv("LOGNAME", username, 1);
(void)setenv("USER", username, 1);
(void)setenv("PATH", rootlogin ? _PATH_STDPATH : _PATH_DEFPATH, 0);

2
Sulla mia scatola Fedora 16, ho entrambi USERe USERNAMEimpostato e il tuo comando ritorna solo LOGNAME.
Joseph R.

1
@JosephR., Sfortunatamente non ho Fedora a portata di mano ma ho anche esaminato le fonti di FreeBSD, vedi UPD ..
poige

Ma questo non è ovviamente il caso di Fedora. Tutto quello che sto dicendo è loginche non sembra essere l'unica cosa che imposta queste variabili.
Joseph R.

1
Nota che Linux è solo un kernel, non ha un logincomando. I sistemi operativi che utilizzano Linux come kernel sono liberi di utilizzare qualsiasi implementazione a loro piacimento. Ad esempio, i sistemi basati su Debian tendono a usare quello di shadow-utils, non util-linux.
Stéphane Chazelas,

1
Si noti che loginspesso non viene invocato quando si accede tramite ssho dalla maggior parte dei gestori di accesso grafici.
Stéphane Chazelas,

11

Non c'è una regola. Ad alcune conchiglie piace tcsho zshimposta $LOGNAME. zshinsiemi $USER.

Essa può essere fissata da alcune cose che accedono come login(come invocato da gettyquando login su un terminale e, talvolta, da altre cose come in.rlogind), cron, su, sudo, sshd, rshd, gestori di accesso grafici o non può.

Se c'è stato un accesso, tuttavia, nella mia esperienza, $USERè generalmente impostato (ma potrebbe non essere aggiornato dopo una modifica dell'ID utente (tramite comandi setuid) all'interno di quella sessione di accesso. POSIX richiede che $LOGNAMEsia impostato al momento dell'accesso (e cron).

Per ottenere il nome di accesso in modo portabile, è meglio utilizzare il lognamecomando (se non è stato effettuato alcun accesso, potrebbe non restituire nulla). Per ottenere l'id utente, utilizzare id -u. Per ottenere un nome utente corrispondente alla corrente efficace user id: id -un. Per ottenerli tutti (la maggior parte delle volte, esiste un solo nome utente per ID utente, ma non è garantito):

perl -le 'while ($n = getpwent()) {print $n if getpwnam($n) == $>}'

Tuttavia, ciò potrebbe non funzionare su sistemi in cui il database degli utenti non può essere elencato (come accade talvolta con i database degli utenti in rete, ad esempio).


3

Probabilmente vuoi fare affidamento sullo standard POSIX qui, dal momento che a un certo punto probabilmente ti preoccuperai non solo del login dell'utente (gestito dal loginprogramma) ma anche di cronlavori e simili.

Pertanto, è necessario sapere che POSIX richiede $LOGNAMEma non $USER. Ad esempio, $USERpotrebbe non essere impostato da cron, come sottolineato in una risposta di Keith Thompson , che fa anche riferimento ad una storia su come ciò si collega alla storia di System-V vs BSD:

... almeno sul mio sistema (Ubuntu 14.04) la variabile d'ambiente $ USER non è impostata per i lavori cron. Invece, puoi usare $ LOGNAME, che fa parte dell'ambiente per i lavori cron.

Secondo la pagina man di environment (7) (digitare man environment per leggerlo), $ USER è usato dai programmi derivati ​​da BSD e $ LOGNAME è usato dai programmi derivati ​​da System-V.


1

Se vuoi usare le variabili di ambiente (invece di whoamio getpwente getpwnam) e non sei sicuro che siano sempre impostate allo stesso modo su tutti i sistemi * NIX, prova questo in bash:

THIS_USER=${USER:-${USERNAME:-${LOGNAME}}}
echo ${THIS_USER}

Se dopo tutto ciò è ancora vuoto, allora sei su un sistema piuttosto esoterico. ;)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.