Linux: Gruppen vs. Gruppen Benutzername

12

Weiß jemand warum der Linux-Befehl

    groups 

zeigt eine andere Ausgabe als

    groups username 

Der angemeldete Benutzer entspricht dem Parameter Benutzername. Beispiel:

    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
Thorsten Niehues
quelle
1
Es gibt so viele Duplikate dieser Frage, dass ich nicht einmal weiß, wo ich anfangen soll.
user1686

Antworten:

12

Wenn Sie ausführen , wird 1 der angegebene Benutzer in und (obwohl es sich um LDAP, NIS oder etwas anderes 2 handeln kann ) gesucht und alle gefundenen Gruppen angezeigt.groups username/etc/passwd/etc/group

Auf der anderen Seite, wenn Sie das ausführen groupsBefehl ohne Argumente, listet es einfach alle Gruppen es sich gehört 3 - das ist nicht unbedingt das gleiche wie das, was in aufgeführt /etc/group. (Siehe unten für eine Erklärung.) In der Tat, die nur gemacht Lookups /etc/groupsind für GIDs zu Gruppennamen zu übersetzen.


Jeder Prozess verfügt über eine Reihe von Anmeldeinformationen , die unter anderem eine "echte Gruppen-ID" (primäre GID), eine "effektive Gruppen-ID" (EGID) und eine Liste von "zusätzlichen Gruppen" -IDs (sekundäre GIDs) enthalten. Standardmäßig erbt ein Prozess seine Anmeldeinformationen von seinem übergeordneten Element. Prozesse, die als Root (UID 0) ausgeführt werden oder über die CAP_SETUIDFähigkeit verfügen, können jedoch beliebige Anmeldeinformationen festlegen.

Insbesondere wenn Sie sich bei Linux anmelden (ob in einem tty, X11 oder über SSH), sucht der Anmeldevorgang (/ bin / login, gdm, sshd) nach Ihrem Benutzernamen, um Ihre UID, primäre GID und sekundäre GIDs zu ermitteln . Auf einem Personal Computer bedeutet dies lediglich das Lesen der entsprechenden Zeilen passwdund groupDateien (oder NIS, LDAP usw.).

Als nächstes wechselt der Anmeldevorgang 4 zu diesen Anmeldeinformationen, bevor Sie Ihre Sitzung starten, und jeder Prozess, den Sie von nun an starten, hat genau die gleichen UIDs und GIDs - das System überprüft 5 nicht /etc/groupmehr und nimmt keine vorgenommenen Änderungen auf.

Auf diese Weise gehört der /usr/bin/groupsProzess zu denselben Gruppen wie beim Anmelden und nicht zu den Angaben in der Datenbank.

Hinweis: Die obige Erklärung gilt auch für fast alle Unixe. für die Windows NT-Familie (außer UIDs und GIDs werden alle als "SIDs" bezeichnet, es gibt keine "primäre Gruppe", die Anmeldeinformationen werden als "Prozesstoken" bezeichnet und CAP_SETUIDsind SeCreateTokenPrivilege oder SeTcbPrivilege ); und wahrscheinlich für die meisten anderen Mehrbenutzer-Betriebssysteme.


1 getpwuid () und getgrouplist () werden verwendet, um die Gruppen eines Benutzers nachzuschlagen.

2 Unter Linux bestimmt glibc /etc/nsswitch.conf, wo nach diesen Informationen gesucht werden soll.

3 groups verwendet getgid (), getegid () und getgroups (), um eigene Anmeldeinformationen abzurufen.

4 setuid (), setgid (), initgroups () und verwandte.

5 Eine Ausnahme ist natürlich die verschiedenen Werkzeuge , die erhöhte (Lauf setuid- ) wie su, sudo, sg, newgrp, pkexec, und so weiter. Dies bedeutet, dass su $USEReine Shell mit der aktualisierten Gruppenliste erzeugt wird.

user1686
quelle
3

groupsallein gibt die aktuelle Gruppenmitgliedschaft des Eigentümers des Prozesses an. Dies kann davon abweichen, groups <username>ob sich die groupdb seit dem Start des Prozesses oder der Prozessverantwortliche geändert hat.

Ignacio Vazquez-Abrams
quelle
groupsgibt keine aktuelle Mitgliedschaft an, sondern die, die zum Zeitpunkt des Aufrufs des Anmeldevorgangs (/ sbin / login, gdm, sshd) "aktuell" war initgroups().
user1686
1

Starten Sie einfach den Computer neu und beide Gruppen und Gruppenbenutzer sollten die gleichen Ergebnisse erzielen.

Der Grund, warum sie unterschiedlich waren, war, dass Sie sich einer neuen Gruppe hinzugefügt haben, zu der Sie beim Starten des Computers nicht gehörten.

Alex
quelle
Sie müssen sicherlich nicht das gesamte System neu starten! Sie müssen nur eine neue Anmeldesitzung starten (dh auf einer neuen virtuellen Konsole mithilfe sueiner erneuten Öffnung der aktuellen Sitzung schließen). Sie können auch newgrpProzesse mit der neuen Gruppe starten.
Pabouk
1
Ich wollte nur eine einfache Schnelllösung geben, die jedes Mal funktioniert. Es gibt viele andere Antworten, die diese Frage bereits ausführlich beantworten. Manchmal wollen die Leute, wie in meinem Fall, eine einfache Lösung, die einfach funktioniert, ohne mehrere Schritte zu durchlaufen.
Alex
0

Führen Sie aus updatedb, ob sich etwas geändert hat.

Das gleiche auf meinem OSX-Computer, wenn sich groupdb nicht geändert hat:

albert-hotspot:~ sami$ groups sami
staff com.apple.access_screensharing com.apple.sharepoint.group.2 everyone _appstore localaccounts _appserverusr admin _appserveradm _lpadmin _lpoperator _developer
albert-hotspot:~ sami$ groups
staff com.apple.access_screensharing com.apple.sharepoint.group.2 everyone _appstore localaccounts _appserverusr admin _appserveradm _lpadmin _lpoperator _developer
albert-hotspot:~ sami$ 
Léo Léopold Hertz 준영
quelle