De plus, ces variables correspondront-elles toujours au nom d'utilisateur actuellement connecté (elles le sont sur mon système Debian)? Puis-je supposer leur disponibilité dans d'autres systèmes Unix?
Je suis également curieux de savoir pourquoi on utiliserait whoami
plutôt que de simplement lire l'une de ces variables.
environment-variables
Tshepang
la source
la source
man
page, vouswhoami
indiquez le nom associé à votre ID utilisateur effectif. Ce qui signifie qu'il retournera quelque chose de différent si vous utilisezsudo
ou exécutez un exécutable setuid. Si vous avezsudo
configuré, essayezsudo whoami
par exemple.USER
etUSERNAME
sont des variables d’environnement ordinaires, ce qui signifie que, si vous le souhaitez, vous pouvez les attribuer à des valeurs arbitraires. Il suffit de taperUSER=xyz
. En d'autres termes, même si ces variables existent, rien ne garantit que leurs valeurs correspondent au nom d'utilisateur actuellement connecté.guarantee
, je voulais dire par défaut (c'est-à-dire en supposant que l'utilisateur ne les a pas changés).sudo whoami
etsudo echo $USER
sudo echo $USER
, le shell se développe$USER
, puis appellesudo
. Alors bien sûr, cela ne produit pas le même résultat quewhoami
. Commesudo whoami
,sudo sh -c 'echo $USER'
fait (généralement) la sortieroot
. En ce qui concerne votre commentaire sur l’whoami
utilisation de l’EUID , notez que celasudo whoami
produiraitroot
même siwhoami
l’UID était utilisé.sudo
ensembles à la fois EUID et UID pour la commande il fonctionne (sauf dans le cas très rare que vous configurez explicitement à se comporter autrement). Comparezsudo id -u
àsudo id -ru
.Réponses:
C'est login .
La page de manuel de connexion Linux (1) indique:
La page de manuel de connexion FreeBSD (1) indique:
Les pages de manuel NetBSD , OpenBSD et OS X disent la même chose.
Voici le code source de la connexion util-linux:
Voici le code source de la connexion FreeBSD:
la source
USER
etUSERNAME
mis et votre commande ne retourne queLOGNAME
.login
que ne semble pas être la seule chose qui détermine ces variables.login
commande. Les systèmes d'exploitation utilisant Linux comme noyau sont libres d'utiliser n'importe quelle implémentation qu'ils souhaitent. Par exemple, les systèmes basés sur Debian ont tendance à utiliser celui de shadow-utils, pas util-linux.login
dans lassh
plupart des cas, la plupart des gestionnaires de connexion graphiques n'appellent pas cette option lors de la connexion.Il n'y a pas de règle. Quelques coquilles aiment
tcsh
ouzsh
ensemble$LOGNAME
.zsh
ensembles$USER
.Il peut être fixé par certaines choses que vous vous connectez comme
login
(comme invoqué pargetty
lorsque la connexion sur un terminal et parfois par d' autres choses commein.rlogind
),cron
,su
,sudo
,sshd
,rshd
, les gestionnaires de connexion graphique ou non.D'après mon expérience, s'il y a déjà eu un login, il
$USER
est généralement défini (mais il se peut qu'il ne soit pas mis à jour après un changement d'identifiant d'utilisateur (via les commandes setuid) au sein de cette session. POSIX exige qu'il$LOGNAME
soit défini lors de la connexion (etcron
).Pour obtenir le nom de connexion de manière portable, le mieux consiste à utiliser la
logname
commande (s'il n'y a pas eu de connexion, elle peut ne rien renvoyer). Pour obtenir l'identifiant de l'utilisateur, utilisezid -u
. Pour obtenir un nom d' utilisateur correspondant à l'ID utilisateur effectif:id -un
. Pour les obtenir tous (la plupart du temps, il n'y a qu'un seul nom d'utilisateur par identifiant, mais ce n'est pas garanti):Bien que cela puisse ne pas fonctionner sur des systèmes où la base de données d'utilisateurs ne peut pas être énumérée (comme cela arrive parfois avec des bases de données d'utilisateurs en réseau, par exemple).
la source
Vous voulez probablement vous appuyer sur le standard POSIX , car à un moment donné, vous vous soucierez probablement non seulement de la connexion utilisateur (gérée par le
login
programme), mais également descron
emplois, etc.Par conséquent, vous devez savoir que POSIX requiert,
$LOGNAME
mais pas$USER
. Par exemple,$USER
ne peut pas être défini par cron, comme indiqué dans une réponse de Keith Thompson , qui fait également référence à une partie de l’histoire sur la relation entre cela et l’histoire de System-V par rapport à BSD:la source
Si vous souhaitez utiliser les variables d'environnement (au lieu de
whoami
ougetpwent
etgetpwnam
) et que vous ne savez pas si elles sont toujours définies de la même manière sur tous les systèmes * NIX, essayez ceci sous bash:S'il est toujours vide après tout cela, alors vous êtes sur un système plutôt ésotérique. ;)
la source