Czy te zmienne zawsze będą pasować do aktualnie zalogowanej nazwy użytkownika (robią to w moim systemie Debian)? Czy mogę założyć ich dostępność w innych systemach uniksowych?
Jestem również ciekawy, dlaczego można by użyć whoami
zamiast po prostu czytać dowolną z tych zmiennych.
environment-variables
tshepang
źródło
źródło
man
stronę,whoami
podaje nazwę powiązaną z efektywnym identyfikatorem użytkownika. Co oznacza, że zwróci coś innego, jeśli używaszsudo
lub uruchamiasz plik wykonywalny setuid. Jeślisudo
skonfigurowałeś, spróbujsudo whoami
na przykład.USER
iUSERNAME
są zwykłymi zmiennymi środowiskowymi, co oznacza, że jeśli chcesz, możesz ustawić je na dowolne wartości. Po prostu wpiszUSER=xyz
. Innymi słowy, nawet jeśli te zmienne istnieją, nie ma gwarancji, że ich wartości odpowiadają aktualnie zalogowanej nazwie użytkownika.guarantee
, miałem na myśli domyślnie (tzn. Zakładając, że użytkownik ich nie zmienił).sudo whoami
isudo echo $USER
sudo echo $USER
powłoka rozszerza się$USER
, a następnie wywołujesudo
. Więc oczywiście nie daje tego samego wyniku, cowhoami
. Podobniesudo whoami
,sudo sh -c 'echo $USER'
robi (zwykle) wyjścieroot
. Jeśli chodzi o komentarz na tematwhoami
używania identyfikatora EUID , zwróć uwagę, żesudo whoami
byłby generowany,root
nawet gdybywhoami
używał identyfikatora UID.sudo
ustawia zarówno identyfikator EUID, jak i identyfikator UID dla uruchomionego polecenia (z wyjątkiem bardzo nietypowej sytuacji, w której jawnie skonfigurowano go, aby zachowywał się inaczej). Porównajsudo id -u
zsudo id -ru
.Odpowiedzi:
To login .
Strona podręcznika logowania do systemu Linux (1) mówi:
Strona podręcznika logowania do FreeBSD (1) mówi:
W NetBSD , OpenBSD i OS X strony man powiedzieć to samo.
Oto kod źródłowy z loginu util-linux:
Oto kod źródłowy z loginu FreeBSD:
źródło
USER
iUSERNAME
ustawione, a twoje polecenie tylko zwracaLOGNAME
.login
że nie wydaje się być jedyną rzeczą ustawiającą te zmienne.login
polecenia. Systemy operacyjne wykorzystujące Linux jako jądro mogą swobodnie korzystać z dowolnej implementacji. Na przykład systemy oparte na Debianie mają tendencję do korzystania z tego z shadow-utils, a nie z ut-linux.login
często nie jest wywoływane podczas logowania sięssh
przez większość graficznych menedżerów logowania.Nie ma reguły. Niektóre muszle lubią
tcsh
lubzsh
ustawiają$LOGNAME
.zsh
zestawy$USER
.To może być ustawiona przez niektórych rzeczy, które w niczym logowania
login
(jak wywoływane przezgetty
przy logowaniu na terminal, a czasem przez inne rzeczy, jakin.rlogind
)cron
,su
,sudo
,sshd
,rshd
, graficznych menedżerów logowania lub nie.Z mojego doświadczenia
$USER
wynika jednak, że generalnie jest ustawiony (ale może nie zostać zaktualizowany po zmianie identyfikatora użytkownika (za pomocą komend setuid) w ramach tej sesji logowania. POSIX wymaga, aby$LOGNAME
był ustawiony podczas logowania (icron
).Aby uzyskać nazwę logowania przenośną, najlepiej użyć
logname
polecenia (jeśli nie było żadnego logowania, może nic nie zwrócić). Aby uzyskać identyfikator użytkownika, użyjid -u
. Aby otrzymać jedną nazwę odpowiadającą aktualnej efektywny id użytkownika:id -un
. Aby uzyskać je wszystkie (przez większość czasu na identyfikator użytkownika przypada tylko jedna nazwa użytkownika, ale nie jest to gwarantowane):Chociaż może to nie działać w systemach, w których nie można wyliczyć bazy danych użytkowników (jak to czasami bywa na przykład w sieciowych bazach danych użytkowników).
źródło
Prawdopodobnie chcesz tutaj polegać na standardzie POSIX , ponieważ w pewnym momencie zapewne będziesz się martwić nie tylko logowaniem użytkownika (zarządzanym przez
login
program), ale takżecron
zadaniami i tym podobnymi.Dlatego powinieneś wiedzieć, że POSIX wymaga,
$LOGNAME
ale nie wymaga$USER
. Np.$USER
Nie może być ustawiony przez crona, jak wskazano w odpowiedzi Keitha Thompsona , który również odwołuje się do historii, w jaki sposób odnosi się to do historii System-V vs BSD:źródło
Jeśli chcesz użyć zmiennych środowiskowych (zamiast
whoami
lubgetpwent
igetpwnam
) i nie masz pewności, czy są one zawsze ustawione w ten sam sposób we wszystkich systemach * NIX, spróbuj tego w bash:Jeśli mimo wszystko nadal jest pusty, oznacza to, że jesteś w dość ezoterycznym systemie. ;)
źródło