Dlaczego dane wyjściowe z `grup` różnią się od` grup użytkowników`, skoro jestem zalogowany jako użytkownik?

21

Nie jestem pewien, dlaczego poniższe mają różne wyniki. Rozumiem, że grupy bez określenia użytkownika podają wszystkie grupy, których członkiem jest aktualnie zalogowany użytkownik.

jacob@box:~$ groups
jacob adm lp dialout cdrom plugdev lpadmin sambashare

jacob@box:~$ groups jacob
jacob : jacob

Co to znaczy „grupy bieżącego procesu” (ze strony podręcznika grup)? Gdzie oni są założeni?

UWAGA: Moja dystrybucja to Ubuntu.

Jake
źródło
@Jake Spróbuj wylogować się, a następnie zalogować ponownie.
1
Mam ten problem na odwrót. „moja_grupa grup” daje mi wszystkie grupy, które mam w pliku / etc / groups, ale wykonanie tylko „grup” pokazuje mi tylko moją grupę podstawową. I rzeczywiście polecenia, które wymagają bycia w pewnej grupie uzupełniającej, zawodzą z powodu braku uprawnień. Pewnie chciałbym wiedzieć, co to powoduje.
Todd Walton,

Odpowiedzi:

11

Może to być jedna z następujących czynności:

  • To może być błąd (choć w to wątpię)
  • Może być konieczne wylogowanie i ponowne zalogowanie

Grupy są ustawione w /etc/group.


źródło
8

Tak jak każdy proces ma aktualny rzeczywisty i skuteczny identyfikator użytkownika oraz rzeczywisty i skuteczny identyfikator grupy, ma także listę grup dodatkowych . Są to liczby (nie nazwy) obsługiwane przez jądro. Są one ustawiane przez proces logowania (lub menedżera wyświetlania) podczas logowania, podobnie jak identyfikator użytkownika. Są dziedziczone przez podprocesy, podobnie jak identyfikator użytkownika.

Kiedy uruchomisz groupsbez argumentów, ostatecznie wywołuje getgroups () w celu uzyskania dodatkowej listy grup z jądra. (W moim systemie Linux / usr / bin / groups to skrypt powłoki, który uruchamia „id -Gn”, który z kolei wywołuje getgroups ().)

Po uruchomieniu groups usernamepolecenie musi „odgadnąć”, jakie będą dodatkowe grupy, gdy ten użytkownik się zaloguje. Zazwyczaj robi to, czytając / etc / group lub rozmawiając z NIS lub rozmawiając z nscd lub ... Cóż, istnieje na wiele sposobów może to działać.

To, co obserwujesz, przypomina odkrycie, że twój obecny rzeczywisty identyfikator użytkownika i twój wpis w / etc / passwd są niespójne. Oznacza to, że jest coś dziwnego w konfiguracji twojego systemu, ale trudno powiedzieć to bez dalszych badań.

Nemo
źródło
3

(Uwaga: groupspolecenie, choć nadal przydatne, jest w większości zastępowane przez polecenie id .)

Użytkownik ma podstawową grupę, która jest tradycyjnie zdefiniowana w pliku /etc/passwdpliku, z którego się loguje, ale która dziś może mieć inne źródła. Może być również członkiem dodatkowych grup, znanych jako grupy drugorzędne lub uzupełniające, tradycyjnie określone w pliku /etc/groups, ale które dziś mogą również pochodzić lub być implikowane z dodatkowych źródeł (takich jak NIS, LDAP, SAMBA itp.).

Grupy podstawowe i dodatkowe są definiowane w momencie logowania i pozostają aktualne . Jednak użytkownik może w dowolnym momencie zmienić swoją bieżącą aktywną grupę podstawową za pomocą newgrppolecenia.

Proces logowania ustawia grupy podstawowe i dodatkowe. W późniejszym przypadku zazwyczaj wywołuje funkcję initcroups libc , która kompiluje listę dodatkowych danych grupowych i przekazuje ją do funkcji setgroups , która ustala ją w kontekście procesu.

Źródłem informacji initgroupssą:

używane przez bibliotekę GNU C i niektóre inne aplikacje do określania źródeł, z których można uzyskać informacje o usługach nazw w różnych kategoriach iw jakiej kolejności. Każda kategoria informacji jest identyfikowana przez nazwę bazy danych.

Te groupspokazy dowodzenia grupy tak obecnie stosowane do użytkownika, a lista rozpocznie z bieżącej grupy podstawowej , a następnie przez grupy uzupełniających od czasu logowania. Wszelkie zmiany źródeł danych po czasie logowania nie są odzwierciedlane na wyświetlanej liście.

groups usernameKomenda prosi Linuksa do obliczenia grupy dla tego użytkownika, który będzie to zrobić przy użyciu głównie pliki /etc/password i /etc/groups, a następnie dodatkowych źródeł. Odzwierciedla to obecną sytuację plików systemowych i może nie być równa bieżącym grupom , które nadal obowiązują od momentu zalogowania.

groups usernameKomenda może dać inny wynik, jeśli nie korzystać ze wszystkich źródeł, że proces logowania używane do obliczania swoich dodatkowych grup, do czego najwyraźniej stało się w Twoim przypadku. Źródła te mogą być niedostępne z twojego loginu lub po prostu nie mogą być przeglądane przez polecenie.

Użycie id usernamepolecenia może dać lepsze wyniki, chociaż nie gwarantuje się, że będzie tak kompletne jak w procesie logowania. idKomenda jest nowsza niż, a miała być bardziej precyzyjny niż starej groupskomendy.

Chociaż groupspolecenie daje dokładny i poprawny wynik, dobrze pokazałeś, że groups usernamenie można na nim polegać.

Nie badając kodu źródłowego groupspolecenia, zgaduję, że implementacja groups usernamepolecenia w analizie dystrybucji Linuksa /etc/groups, która w twoim przypadku nie zawierała niczego, ale nie używa /etc/nsswitch.conf, z której pochodziły wszystkie twoje dodatkowe grupy. W związku z tym są wymienione jedynie podstawowej nazwy grupowego jacob.

Aby uzyskać więcej informacji zobacz:

harrymc
źródło