Stimmen diese Variablen auch immer mit dem aktuell angemeldeten Benutzernamen überein (auf meinem Debian-System)? Kann ich ihre Verfügbarkeit in anderen Unix-ähnlichen Systemen annehmen?
Ich bin auch neugierig, warum man whoami
diese Variablen verwenden sollte, anstatt sie nur zu lesen.
environment-variables
Tshepang
quelle
quelle
man
Seite ansehen,whoami
wird der Name angezeigt, der Ihrer effektiven Benutzer-ID zugeordnet ist. Dies bedeutet, dass etwas anderes zurückgegeben wird, wenn Siesudo
eine Setuid-Programmdatei verwenden oder ausführen. Wenn Siesudo
eingerichtet haben, versuchen Sie essudo whoami
zum Beispiel.USER
undUSERNAME
sind gewöhnliche Umgebungsvariablen, was bedeutet, dass Sie sie, wenn Sie möchten, auf beliebige Werte setzen können. Einfach tippenUSER=xyz
. Mit anderen Worten, auch wenn diese Variablen existieren, gibt es keine Garantie dafür, dass ihre Werte mit dem aktuell angemeldeten Benutzernamen übereinstimmen.guarantee
, meinte ich standardmäßig (dh vorausgesetzt Benutzer hat sie nicht geändert).sudo whoami
undsudo echo $USER
sudo echo $USER
die Shell expandiert$USER
und ruft dann aufsudo
. Natürlich wird nicht die gleiche Ausgabe wie erzeugtwhoami
. Wiesudo whoami
,sudo sh -c 'echo $USER'
gibt (normalerweise) ausroot
. In Bezug auf Ihre Kommentare überwhoami
die EUID mit , Notiz , diesudo whoami
Ausgabe würde ,root
wenn auchwhoami
die UID verwendet.sudo
Sätze sowohl EUID und UID für den Befehl es (außer in der sehr ungewöhnlichen Situation , dass Sie konfigurieren es ausdrücklich anders verhalten) läuft. Vergleichen Siesudo id -u
mitsudo id -ru
.Antworten:
Es ist ein Login .
Die Linux Login (1) Manpage sagt:
Die FreeBSD Login (1) Manpage sagt:
Die NetBSD- , OpenBSD- und OS X- Manpages sagen dasselbe.
Hier ist der Quellcode aus dem Util-Linux-Login:
Hier ist der Quellcode aus dem FreeBSD-Login:
quelle
USER
undUSERNAME
setze und dein Befehl kehrt nur zurückLOGNAME
.login
es scheint nicht das Einzige zu sein, was diese Variablen einstellt.login
Befehl hat. Betriebssysteme, die Linux als Kernel verwenden, können jede beliebige Implementierung verwenden. Zum Beispiel neigen Debian-basierte Systeme dazu, das von shadow-utils zu verwenden, nicht util-linux.login
häufig nicht aufgerufen wird, wenn Sie sich überssh
oder von den meisten grafischen Anmeldemanagern anmelden.Es gibt keine Regel. Einige Muscheln mögen
tcsh
oderzsh
setzen$LOGNAME
.zsh
setzt$USER
.Es kann durch einige Dinge eingestellt werden , dass Sie in wie log
login
(wie durch aufgerufen ,getty
wenn Anmeldung an einem Terminal und manchmal durch andere Dinge wiein.rlogind
)cron
,su
,sudo
,sshd
,rshd
, grafische Login - Manager oder auch nicht.Wenn es jedoch eine Anmeldung gibt, wird diese nach meiner Erfahrung
$USER
im Allgemeinen festgelegt (möglicherweise wird sie jedoch nach einer Änderung der Benutzer-ID (über setuid-Befehle) in dieser Anmeldesitzung nicht aktualisiert. POSIX erfordert, dass$LOGNAME
diese bei der Anmeldung festgelegt wird (undcron
).Um den Anmeldenamen portabel zu erhalten, verwenden Sie am besten den
logname
Befehl (wenn keine Anmeldung erfolgt ist, wird möglicherweise nichts zurückgegeben). Verwenden Sie, um die Benutzer-ID abzurufenid -u
. Um einen Benutzernamen der aktuellen effektiven Benutzer - ID entspricht:id -un
. Um alle zu erhalten (meistens gibt es nur einen Benutzernamen pro Benutzer-ID, aber das ist nicht garantiert):Dies funktioniert jedoch möglicherweise nicht auf Systemen, auf denen die Benutzerdatenbank nicht aufgelistet werden kann (wie dies manchmal bei vernetzten Benutzerdatenbanken der Fall ist).
quelle
Sie möchten sich hier wahrscheinlich auf den POSIX- Standard verlassen, da Sie sich zu einem bestimmten Zeitpunkt wahrscheinlich nicht nur um die Benutzeranmeldung (die vom
login
Programm verwaltet wird ), sondern auch umcron
Aufträge und dergleichen kümmern werden .Daher sollten Sie wissen, dass POSIX dies erfordert,
$LOGNAME
jedoch nicht$USER
. ZB$USER
darf nicht von cron gesetzt werden, wie in einer Antwort von Keith Thompson ausgeführt , die auch einen Hinweis auf die Beziehung zwischen System-V und BSD enthält:quelle
Wenn Sie die Umgebungsvariablen (anstelle von
whoami
odergetpwent
undgetpwnam
) verwenden möchten und nicht sicher sind, ob sie auf allen * NIX-Systemen immer auf die gleiche Weise festgelegt sind, versuchen Sie dies in bash:Wenn es danach immer noch leer ist, befinden Sie sich auf einem eher esoterischen System. ;)
quelle