Czy ktoś wie, dlaczego polecenie linux
groups
pokazuje inne wyjście niż
groups username
Zalogowany użytkownik jest taki sam jak parametr nazwa użytkownika. Przykład:
thorsten@ubuntu:~/tmp$ groups
thorsten adm dialout cdrom plugdev lpadmin admin sambashare
thorsten@ubuntu:~/tmp$ groups thorsten
thorsten : thorsten adm dialout cdrom plugdev nogroup lpadmin admin sambashare
linux
user-accounts
Thorsten Niehues
źródło
źródło
Odpowiedzi:
Po uruchomieniu wyszukuje 1 danego użytkownika i (chociaż może to być LDAP, NIS lub coś innego 2 ) i pokazuje wszystkie znalezione grupy.
groups username
/etc/passwd
/etc/group
Z drugiej strony, po uruchomieniu
groups
polecenia bez żadnych argumentów, po prostu wyświetla listę wszystkich grup, do których on sam należy, do 3 - co niekoniecznie jest takie samo jak to, co jest wymienione/etc/group
. (Objaśnienia znajdują się poniżej). W rzeczywistości jedynymi dokonanymi przeglądami/etc/group
są tłumaczenia GID na nazwy grup.Każdy proces ma zestaw poświadczeń , który zawiera (między innymi) „rzeczywisty identyfikator grupy” (podstawowy GID), „efektywny identyfikator grupy” (EGID) oraz listę „dodatkowych grupowych” identyfikatorów (wtórne GID). Domyślnie proces dziedziczy dane uwierzytelniające po rodzicu; jednak procesy działające jako root (UID 0) lub posiadające taką
CAP_SETUID
możliwość mogą ustawić dowolne poświadczenia.W szczególności, gdy logujesz się do systemu Linux (czy to w tty, X11, czy przez SSH), proces logowania (/ bin / login, gdm, sshd) wyszukuje twoją nazwę użytkownika w celu ustalenia twojego UID, podstawowego GID i pomocniczego GID . Na komputerze osobistym oznacza to po prostu odczyt odpowiednich wierszy
passwd
igroup
plików (lub NIS, LDAP itp.).Następnie proces logowania przełącza 4 na te dane uwierzytelniające przed rozpoczęciem sesji, a każdy proces, który uruchomisz odtąd, będzie miał dokładnie takie same UID i GID - system nie sprawdza
/etc/group
już 5 i nie wykrywa żadnych dokonanych modyfikacji.W ten sposób
/usr/bin/groups
proces będzie należeć do tych samych grup, co podczas logowania , a nie do tego, co mówi baza danych.Uwaga: powyższe wyjaśnienie dotyczy także prawie wszystkich uniksów; do rodziny Windows NT (oprócz UID i GID wszystkie nazywane są „SID”, nie ma „grupy podstawowej”, poświadczenia nazywane są „tokenem procesu” i
CAP_SETUID
są to SeCreateTokenPrivilege lub SeTcbPrivilege ); i prawdopodobnie dla większości innych systemów operacyjnych dla wielu użytkowników.1 getpwuid () i getgrouplist () służą do wyszukiwania grup użytkowników.
2 W systemie Linux glibc używa
/etc/nsswitch.conf
do określenia, gdzie szukać tych informacji.3
groups
używa getgid (), getegid () i getgroups () w celu uzyskania własnych poświadczeń.4 setuid (), setgid (), initgroups () i powiązane.
5 wyjątkiem, oczywiście, różne narzędzia, które działają zwiększone ( setuid ), takie jak
su
,sudo
,sg
,newgrp
,pkexec
, i tak dalej. Oznacza to, żesu $USER
spawnuje powłokę ze zaktualizowaną listą grup.źródło
groups
samodzielnie daje bieżące członkostwo grupy właścicielowi procesu. Może się to różnić od sytuacji,groups <username>
gdy groupdb zmieniło się od czasu rozpoczęcia procesu lub zmienił się właściciel procesu.źródło
groups
nie daje obecnego członkostwa, a raczej to, co było „aktualne” w momencie, gdy wywołano proces logowania (/ sbin / login, gdm, sshd)initgroups()
.Po prostu uruchom ponownie komputer, a zarówno grupy, jak i grupy użytkowników powinny dać takie same wyniki.
Różniły się one dlatego, że dodałeś się do nowej grupy, do której nie należałeś, kiedy uruchamiałeś komputer.
źródło
su
, zamykając ponowne otwieranie bieżącej sesji). Możesz także użyćnewgrp
do uruchomienia procesów z dołączoną nową grupą.Uruchom
updatedb
, sprawdź, czy jest jakaś zmiana.To samo na moim komputerze z systemem OSX, gdy groupdb się nie zmieniło:
źródło