Wygląda na to, że żadna z proponowanych metod nie działa dotychczas bez polegania na $ USER lub wywoływania osobnego procesu. Czy nie ma wbudowanego bash, aby uzyskać nazwę użytkownika bez wywoływania osobnego procesu?
ColinM
9
Kiedy słyszysz polecenie, ale nie wiesz, jak go użyć, sprawdzanie man whoamijest zwykle dobrym pierwszym przystankiem do sprawdzenia dokumentacji.
Mark Stosberg,
Odpowiedzi:
470
W wierszu polecenia wprowadź
whoami
lub
echo "$USER"
Aby zapisać te wartości w zmiennej, wykonaj
myvariable=$(whoami)
lub
myvariable=$USER
Oczywiście nie musisz tworzyć zmiennej, ponieważ po to jest $USERzmienna.
Krótka uwaga, że $ USER i whoami zwracają różne wartości, jeśli uruchamiasz komendę przez ssh jako inny użytkownik. whoami zwraca użytkownika systemu operacyjnego, a $ USER zwraca użytkownika ssh.
BillMan
4
@BillMan, co to w ogóle oznacza? Czy możesz podać przykład?
Dejay Clayton
17
W niektórych przypadkach $USERwcale nie jest ustawiony. Co gorsza, jest to po prostu zmienna środowiskowa, więc użytkownik może ją zastąpić:USER=thisisnotmyname bash -c 'echo $USER' # prints thisisnotmyname
sitaktif
1
@sitaktif Co sugerujesz jako rozwiązanie tego problemu?
SethMMorton,
3
@SethMMorton Zdaję sobie sprawę, że sprawiłem, że problem brzmiał gorzej niż zwykle. Aby odpowiedzieć na pytanie, użycie whoami(tak jak sugerowałeś) całkowicie eliminuje problem, zakładając, że zastąpione zmienne środowiskowe są potencjalnym problemem w twoim kontekście.
sitaktif
81
Alternatywą dla whoamijest id -u -n.
id -uzwróci identyfikator użytkownika (np. 0 dla roota ).
O ile się nie mylę, byłby to właściwy sposób, jeśli przenośność stanowi problem, ponieważ idpolecenie -ui -nflagi są częścią posix
3
To naprawdę powinna być zaakceptowana odpowiedź. "${USER}"i whoamioba zależą od sposobu logowania. W szczególności powłoki logowania i sudo ustawiają $ USER i whoamipatrzą na użytkownika podłączonego do standardowego wejścia. Jeśli jednak uruchamiasz zadanie wsadowe z crona lub uruchamiasz skrypt startowy jako inny użytkownik niż root, wówczas albo wyprowadzą one niewłaściwego użytkownika (root), albo w ogóle nic. Ta odpowiedź zwróci prawidłową wartość bez względu na identyfikator użytkownika procesu.
Asfand Qazi
Nie jest to przydatne, jeśli chcesz podać nazwę użytkownika zamiast identyfikatora
Jonathan
3
jeśli wypróbujesz polecenie przed dodaniem nieprawdziwych komentarzy, zobaczysz, że -nargument wypisuje nazwę użytkownika, tak jak w pierwotnym zadanym pytaniu. zobacz: id -u -nodciski brett- nawet na darwin.
Brett
20
Użyj standardowej komendy Unix / Linux / BSD / MacOS, lognameaby pobrać zalogowanego użytkownika. Ignoruje to środowisko, podobnie jak sudo, ponieważ są to nierzetelni reporterzy. Zawsze wydrukuje nazwę zalogowanego użytkownika, a następnie zakończy działanie. To polecenie istnieje od około 1981 roku.
Dlaczego potrzebujesz bash jako tłumacza? Nic w pokazanym wierszu poleceń nie wydaje się być specyficzne dla żadnej powłoki. W rzeczywistości, dlaczego w ogóle włącza rurę przez awk? O ile mi wiadomo, twoje pspolecenie jest wszystkim, co jest wymagane do wyświetlenia właściciela bieżącego pid powłoki.
ghoti
Dla nas, ludzi, lekceważenie zbędnych informacji jest naturalne. Część awk izoluje pożądane dane - dla zmiennych lub ogólnie komputera, który nie jest w stanie przyjąć założeń w locie na tym podstawowym poziomie.
BradChesney79,
W command -p idsystemie Solaris użyj (z powłoki POSIX) lub /usr/xpg4/bin/id. Mówiąc bardziej ogólnie, w systemie Solaris chciałbyś zmodyfikować swoje środowisko, aby umieścić się w środowisku POSIX (z czymś takim jak PATH=getconf PATH` i koniecznie uruchom /usr/xpg4/bin/sh), aby uniknąć utknięcia w poleceniach z lat 70. / 80.
Stephane Chazelas,
„ps: nieznana opcja - o”
Anand Rockzz
12
Dwa polecenia:
id wypisuje identyfikator użytkownika wraz z grupami. Format:uid=usernumber(username) ...
$ whoami nie jest dostępne jako zmienna w bash. Musisz wykonać $ (whoami) lub `whoami`, aby faktycznie wykonać polecenie whoami!
Rudolf Mayer,
@RudolfMayer Naprawiłem to
wjandrea,
6
Gdy wymagane są uprawnienia roota (sudo), które zwykle wynoszą 90% + podczas korzystania ze skryptów, metody z poprzednich odpowiedzi zawsze dają rootodpowiedź.
Aby uzyskać obecnego „zalogowanego” użytkownika, jest to równie proste, ale wymaga dostępu do różnych zmiennych: $SUDO_UIDi $SUDO_USER.
Bieżącą nazwę użytkownika można uzyskać w czystym Bashie dzięki ${parameter@operator}rozszerzeniu parametrów (wprowadzonemu w Bash 4.4):
$ : \\u
$ printf '%s\n'"${_@P}"
:Wbudowanej (synonim true) jest używany zamiast zmiennej czasowej poprzez ustawienie ostatni argument, który jest przechowywany w $_. Następnie rozwijamy go ( \u) tak, jakby był to ciąg znaków zachęty dla Poperatora.
Jest to lepsze niż używanie $USER, ponieważ $USERjest to zwykła zmienna środowiskowa; można go modyfikować, wyłączać itp. Nawet jeśli nie jest to celowo modyfikowane, częstym przypadkiem, w którym nadal jest niepoprawny, jest przełączanie użytkownika bez uruchamiania powłoki logowania ( suustawienie domyślne).
W większości systemów Linux wystarczy wpisać whoami w wierszu poleceń, aby podać identyfikator użytkownika.
Jednak w systemie Solaris może być konieczne określenie identyfikatora użytkownika poprzez określenie identyfikatora UID użytkownika zalogowanego za pomocą poniższej komendy.
echo $UID
Po rozpoznaniu identyfikatora UID znajdź użytkownika, dopasowując identyfikator UID do /etc/passwdpliku.
Pytanie dotyczyło sposobu umieszczenia nazwy użytkownika w skrypcie bash. Ta odpowiedź dotyczy tego, jak uzyskać numeryczny identyfikator użytkownika (nie nazwę użytkownika) z kodu C działającego w jądrze systemu Linux (na przykład z niestandardowego modułu jądra systemu Linux). To nie jest odpowiedź na zadane pytanie, to odpowiedź na inne pytanie.
man whoami
jest zwykle dobrym pierwszym przystankiem do sprawdzenia dokumentacji.Odpowiedzi:
W wierszu polecenia wprowadź
lub
Aby zapisać te wartości w zmiennej, wykonaj
lub
Oczywiście nie musisz tworzyć zmiennej, ponieważ po to jest
$USER
zmienna.źródło
$USER
wcale nie jest ustawiony. Co gorsza, jest to po prostu zmienna środowiskowa, więc użytkownik może ją zastąpić:USER=thisisnotmyname bash -c 'echo $USER' # prints thisisnotmyname
whoami
(tak jak sugerowałeś) całkowicie eliminuje problem, zakładając, że zastąpione zmienne środowiskowe są potencjalnym problemem w twoim kontekście.Alternatywą dla
whoami
jestid -u -n
.id -u
zwróci identyfikator użytkownika (np. 0 dla roota ).źródło
id
polecenie-u
i-n
flagi są częścią posix"${USER}"
iwhoami
oba zależą od sposobu logowania. W szczególności powłoki logowania i sudo ustawiają $ USER iwhoami
patrzą na użytkownika podłączonego do standardowego wejścia. Jeśli jednak uruchamiasz zadanie wsadowe z crona lub uruchamiasz skrypt startowy jako inny użytkownik niż root, wówczas albo wyprowadzą one niewłaściwego użytkownika (root), albo w ogóle nic. Ta odpowiedź zwróci prawidłową wartość bez względu na identyfikator użytkownika procesu.-n
argument wypisuje nazwę użytkownika, tak jak w pierwotnym zadanym pytaniu. zobacz:id -u -n
odciskibrett
- nawet na darwin.Użyj standardowej komendy Unix / Linux / BSD / MacOS,
logname
aby pobrać zalogowanego użytkownika. Ignoruje to środowisko, podobnie jak sudo, ponieważ są to nierzetelni reporterzy. Zawsze wydrukuje nazwę zalogowanego użytkownika, a następnie zakończy działanie. To polecenie istnieje od około 1981 roku.źródło
Hack, którego użyłem na Solarisie 9 i Linuksie i który działa dobrze dla obu z nich:
Ten fragment kodu wyświetla nazwę użytkownika z bieżącym identyfikatorem EUID.
UWAGA: potrzebujesz Basha jako tłumacza tutaj.
W systemie Solaris masz problemy z metodami opisanymi powyżej:
id
nie akceptuje parametrów-u
i-n
(więc będziesz musiał przeanalizować dane wyjściowe)whoami
nie istnieje (domyślnie)who am I
drukuje właściciela aktualnego terminala (ignoruje EUID)$USER
zmienna jest ustawiana poprawnie dopiero po odczytaniu plików profilu (na przykład/etc/profile
)źródło
ps
polecenie jest wszystkim, co jest wymagane do wyświetlenia właściciela bieżącego pid powłoki.command -p id
systemie Solaris użyj (z powłoki POSIX) lub/usr/xpg4/bin/id
. Mówiąc bardziej ogólnie, w systemie Solaris chciałbyś zmodyfikować swoje środowisko, aby umieścić się w środowisku POSIX (z czymś takim jakPATH=
getconf PATH` i koniecznie uruchom/usr/xpg4/bin/sh
), aby uniknąć utknięcia w poleceniach z lat 70. / 80.Dwa polecenia:
id
wypisuje identyfikator użytkownika wraz z grupami. Format:uid=usernumber(username) ...
whoami
podaje aktualną nazwę użytkownikaźródło
Gdy wymagane są uprawnienia roota (sudo), które zwykle wynoszą 90% + podczas korzystania ze skryptów, metody z poprzednich odpowiedzi zawsze dają
root
odpowiedź.Aby uzyskać obecnego „zalogowanego” użytkownika, jest to równie proste, ale wymaga dostępu do różnych zmiennych:
$SUDO_UID
i$SUDO_USER
.Można je powtórzyć:
Lub przypisane, na przykład:
źródło
W systemie operacyjnym Solaris użyłem tego polecenia:
W systemie Linux - ktoś już odpowiedział na to w komentarzach.
źródło
W przypadku Bash , KornShell (
ksh
)sh
itp. Na wiele pytań można szybko odpowiedzieć:aby uzyskać dokumentację dla używanego systemu lub zwykle wygodniej:
google „funkcja man”
Może to dać różne wyniki dla niektórych rzeczy, w których Linux i Unix mają niewielkie różnice.
Aby odpowiedzieć na to pytanie, wpisz „whoami” w swojej skorupce.
Aby wykonać skrypt:
źródło
Bieżącą nazwę użytkownika można uzyskać w czystym Bashie dzięki
${parameter@operator}
rozszerzeniu parametrów (wprowadzonemu w Bash 4.4)::
Wbudowanej (synonimtrue
) jest używany zamiast zmiennej czasowej poprzez ustawienie ostatni argument, który jest przechowywany w$_
. Następnie rozwijamy go (\u
) tak, jakby był to ciąg znaków zachęty dlaP
operatora.Jest to lepsze niż używanie
$USER
, ponieważ$USER
jest to zwykła zmienna środowiskowa; można go modyfikować, wyłączać itp. Nawet jeśli nie jest to celowo modyfikowane, częstym przypadkiem, w którym nadal jest niepoprawny, jest przełączanie użytkownika bez uruchamiania powłoki logowania (su
ustawienie domyślne).źródło
W większości systemów Linux wystarczy wpisać whoami w wierszu poleceń, aby podać identyfikator użytkownika.
Jednak w systemie Solaris może być konieczne określenie identyfikatora użytkownika poprzez określenie identyfikatora UID użytkownika zalogowanego za pomocą poniższej komendy.
Po rozpoznaniu identyfikatora UID znajdź użytkownika, dopasowując identyfikator UID do
/etc/passwd
pliku.źródło
Pobierz bieżącą instrukcję użytkownika
źródło