Jak mogę uzyskać nazwę użytkownika bieżącego użytkownika w Bash?


321

Piszę program w Bash, który musi uzyskać nazwę użytkownika.

Słyszałem o czymś zwanym whoami, ale nie mam pojęcia, co on robi i jak go używać.

Jakiego polecenia używam, aby uzyskać bieżącą nazwę użytkownika?


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.


53
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 ).


5
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.

My-Mac:~ devin$ logname
devin
My-Mac:~ devin$ sudo logname
Password:
devin
My-Mac:~ devin$ sudo su -
My-Mac:~ root# logname
devin
My-Mac:~ root# echo $USER
root

17

Hack, którego użyłem na Solarisie 9 i Linuksie i który działa dobrze dla obu z nich:

ps -o user= -p $$ | awk '{print $1}'

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:

  • idnie akceptuje parametrów -ui -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)
  • $USERzmienna jest ustawiana poprawnie dopiero po odczytaniu plików profilu (na przykład /etc/profile)

1
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:

  1. id wypisuje identyfikator użytkownika wraz z grupami. Format:uid=usernumber(username) ...

  2. whoami podaje aktualną nazwę użytkownika


1
$ 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.

Można je powtórzyć:

echo $SUDO_UID
echo $SUDO_USER

Lub przypisane, na przykład:

myuid=$SUDO_UID
myuname=$SUDO_USER

6

W systemie operacyjnym Solaris użyłem tego polecenia:

$ who am i     # Remember to use it with space.

W systemie Linux - ktoś już odpowiedział na to w komentarzach.

$ whoami       # Without space

5

W przypadku Bash , KornShell ( ksh) shitp. Na wiele pytań można szybko odpowiedzieć:

man [function]

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:

myvar=$(whoami)

2

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).


1

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.

cat /etc/passwd | cut -d":" -f1,3

-4

Pobierz bieżącą instrukcję użytkownika

#define get_current_user()              \
({                                      \
    struct user_struct *__u;            \
    const struct cred *__cred;          \
    __cred = current_cred();            \
    __u = get_uid(__cred->user);        \
    __u;                                \
})

2
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.
Simon Kissane
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.