Wie kann ich herausfinden, welche Benutzer sich in Linux in einer Gruppe befinden?

68

Ich habe kürzlich neue Benutzer erstellt und sie bestimmten Gruppen zugewiesen. Ich habe mich gefragt, ob es einen Befehl gibt, der alle Benutzer anzeigt, die einer bestimmten Gruppe zugeordnet sind. Ich habe versucht, den Befehl 'groups' zu verwenden, aber wenn ich diesen Befehl verwende, heißt es: 'groups: not found'.

Jess Louise
quelle
3
Das ist der groupsBefehl. Es ist unwahrscheinlich, dass Sie es nicht unter Linux haben, da es Teil von coreutils ist.
Thomas Dickey
@ThomasDickey Aber es ist möglich - wie bei einigen NASes.
Thomas W.

Antworten:

43

Sie können grep verwenden:

grep '^group_name_here:' /etc/group

Hier werden nur zusätzliche Gruppenmitgliedschaften aufgeführt, nicht der Benutzer, der diese Gruppe als primäre Gruppe hat. Und es werden nur lokale Gruppen gefunden, keine Gruppen von einem Netzwerkdienst wie LDAP.

ARG
quelle
6
Funktioniert nicht mit zentraler Authentifizierung.
Maxim Egorushkin
1
Dies könnte sehr verwirrend sein, wahrscheinlich aufgrund des primären / sekundären Unterschieds. Ich denke, dies sollte zugunsten von vermieden werden. sudo lid -g {group}Ich habe ein System, in dem diese Antwort 8 Benutzer in einer Gruppe sudo lid -g {group}auflistet, während Listen 10.
DKroot
Siehe getentAntwort von @ Murray Jensen unten
scrutari
84

Ich bevorzuge den Befehl getent ...

Da getent denselben Namensdienst wie das System verwendet, zeigt getent alle Informationen an, einschließlich der Informationen, die aus Netzwerkinformationsquellen wie LDAP stammen.

Für eine Gruppe sollten Sie also Folgendes verwenden ...

getent group name_of_group

Dabei wird der Name_der_Gruppe durch die Gruppe ersetzt, nach der Sie suchen möchten. Beachten Sie, dass dies nur zusätzliche Gruppenmitgliedschaften zurückgibt, nicht jedoch die Benutzer, die diese Gruppe als primäre Gruppe haben.

Es gibt eine ganze Reihe weiterer Suchvorgänge, die Sie durchführen können ... passwdund die Sie benötigen, um Primärgruppen aufzulisten.

Murray Jensen
quelle
1
Die anderen Antworten gelten nicht, wenn Sie kein Administrator sind und die Gruppeninformationen auf einem anderen Server gespeichert sind.
Andrés Alcarraz
1
Dies könnte sehr verwirrend sein, wahrscheinlich aufgrund des primären / sekundären Unterschieds. Ich denke, dies sollte zugunsten von vermieden werden. sudo lid -g {group}Ich habe ein System, in dem diese Antwort 8 Benutzer in einer Gruppe sudo lid -g {group}auflistet, während Listen 10.
DKroot
12

Einfacher zu machen groups [username]

Wenn Sie alle lokalen Benutzer und ihre lokalen Gruppen auflisten möchten, können Sie dies tun

cat /etc/passwd | awk -F':' '{ print $1}' | xargs -n1 groups

Wenn Sie "groups: command not found" erhalten, ist es wahrscheinlich, dass Sie Ihren Umgebungspfad zum Schlechten bearbeitet haben, um Ihren Pfad zurückzusetzen PATH=$(getconf PATH)

ZN13
quelle
Es funktioniert für eine bestimmte Gruppe, wenn | grep {group}hinzugefügt wird, und gibt die richtige Antwort im Gegensatz zu getent group name_of_groupodergrep '^group_name_here:' /etc/group
DKroot
1
Stattdessen cat /etc/passwdsollten Sie verwenden, gentent passwddamit Benutzer in nis / ldap weiterhin aufgelistet werden. Der einzige Nachteil ist, dass es eine ganze Weile dauern kann.
Brian Minton
8
Gruppenmem -g Gruppenname -l

listet alle Benutzer in der benannten Gruppe auf.

user198963
quelle
Beachten Sie, dass dies groupmemsTeil der Schatten-Utils ist, die in den meisten Linux-Distributionen verwendet werden, groupmemsderzeit jedoch in Debian und Derivaten nicht vorhanden ist (ein Fehler, der jetzt behoben, aber noch nicht in einer Veröffentlichung enthalten ist (Stand: November 2016))
Stéphane Chazelas
2
Beachten Sie auch, dass groupmemsnur Gruppen in /etc/group(nicht die in LDAP oder einer anderen Benutzerdatenbank) behandelt werden und Superuser-Berechtigungen erforderlich sind, wenn versucht wird, / etc / gshadow zu öffnen.
Stéphane Chazelas
Trotz der oben genannten Einschränkungen ist dieser Befehl für bestimmte Situationen ideal, da keine zusätzliche Analyse der Ausgabe (dh cutund der Freunde) erforderlich ist .
BONH
Dies könnte sehr verwirrend sein, wahrscheinlich aufgrund des primären / sekundären Unterschieds. Ich denke, dies sollte zugunsten von vermieden werden sudo lid -g {group}. Ich habe ein System, in dem diese Antwort 8 Benutzer in einer Gruppe sudo lid -g {group}auflistet, während 10 auflistet.
DKroot
5

Ich bin überrascht, dass niemand etwas erwähnt hat

id <user>

Dieser Befehl gibt eine Liste der Gruppen an, in denen sich der Benutzer befindet.

Alex
quelle
3
Denn entgegen dem Titel wollte der Fragesteller die Benutzer innerhalb einer bestimmten Gruppe kennen, nicht die Gruppen eines bestimmten Benutzers, wie in der Frage beschrieben. Ich habe den Titel jetzt umformuliert, damit er zum Inhalt passt.
Dubu
Aaah, ich verstehe. Ich hätte den Fragentext besser lesen sollen. Vielen Dank.
Alex
4

groupsBefehl druckt Gruppenmitgliedschaften für einen Benutzer. Sie können den lidBefehl verwenden, um Benutzer in einer Gruppe aufzulisten, z.

# lid -g <groupname>
Kadir
quelle
4
lidist Teil von libuser, das bei vielen Distributionen nicht standardmäßig installiert ist.
Chris Down
2

OP formulierte die Frage, um die Verwendung des Befehls groups auszuschließen . Da dies Teil von coreutils unter Linux ist, wurde entweder (a) es entfernt oder (b) OP gibt den Namen falsch ein.

OP könnte groupszum Beispiel so verwendet werden:

for name in $(cut -d: -f1 /etc/passwd);do groups $name|grep -w sudo|awk '{print $1;}';done

Eine vorgeschlagene Antwort ist nur grep's für den Gruppennamen in /etc/group. Manchmal funktioniert das wie vorgesehen.

Eine etwas bessere Verwendung von grep berücksichtigt die Syntax von /etc/group:

group_name:password:GID:user_list

so dass nur der Teil vor dem ersten Doppelpunkt ein gültiger Gruppenname ist. Ein einfaches Greifen ohne Rücksicht auf die Syntax kann (und wird) irreführende Übereinstimmungen aus der Datei abrufen. Verwenden Sie reguläre Ausdrücke, damit grep genau den Anforderungen entspricht:

grep -E '^users:' /etc/group |sed -e 's/^.*://'

oder mit einer Shell-Variablen:

grep -E '^'$groupname':' /etc/group |sed -e 's/^.*://'

Hier werden jedoch nur diejenigen aufgelistet, die keiner Standardgruppe angehören . So fügen Sie diejenigen , müssen Sie die Kennwortdatei berücksichtigen, beispielsweise durch die Gruppen-ID - Nummer von Extrahieren /etc/groupund Drucken der Benutzer , deren Standard - Gruppenspiele aus /etc/passwd, zum Beispiel,

grp=$(awk -F: '$1 ~ /^users$/ {print $3; }' </etc/group)
awk -F: '$4 ~ /^'$grp'$/ { print $1; }' </etc/passwd

Sie können dasselbe auch mit grep und sed machen, aber es ist mehr Arbeit als mit awk.

Eine andere vorgeschlagene Antwort schlug die Verwendung vor getent, die sich wahrscheinlich auch auf einem Linux-Rechner befindet (zusammen mit Debian ist sie Teil von GNU libc). Eine schnelle Überprüfung zeigt jedoch, dass nur der /etc/groupInhalt bereitgestellt wird.

Ich habe (wie die meisten) keine libusersoder keine lidinstalliert, daher kann ich nicht beurteilen, ob sie die Bedingungen von OP erfüllen.

Es gibt auch das idProgramm, das Gruppeninformationen gibt. Jemand könnte darauf als mögliche Antwort eingehen.

Thomas Dickey
quelle
Oder einfach, sed -n "s/^$groupname:.*://p" /etc/groupaber das könnte immer noch zu falschen Ergebnissen führen, wenn der Gruppenname RE-Operatoren enthält ( .zum Beispiel ist dies bei Gruppennamen nicht ungewöhnlich).
Stéphane Chazelas
GNU getentfragt auch LDAP / NIS ab, möglicherweise jedoch nicht, wenn die Enumeration für die Gruppendatenbank explizit deaktiviert ist.
Stéphane Chazelas
Beachten Sie, dass groupsdies nicht hilfreich ist, da hier die Gruppen aufgelistet werden, denen ein bestimmter Benutzer angehört, im Gegensatz zu der Liste der Mitglieder einer bestimmten Gruppe.
Stéphane Chazelas
2

Klappt wunderbar:

cut -d: -f1,4 /etc/passwd | grep $(getent group <groupname> | cut -d: -f3) | cut -d: -f1
Bhavik
quelle
Im Gegensatz zur akzeptierten Antwort von @ARG listet dieser Befehl die Benutzer mit <Gruppenname> als primärer Gruppe auf
Bhavik
Dies sollte die akzeptierte Antwort sein
Nikolay Nenov
1
Ich stimme dir nicht zu. Da Benutzer in / etc / passwd gelesen werden, funktioniert dies nicht mit anderen nsswitch-Modulen, die auf LDAP usw. zugreifen
Ivan Vučica,
Funktionierte bei mir nicht richtig: Ich habe 4 Mitglieder in einer Gruppe, während sudo lid -gListen 8. @Bhavik Die akzeptierte Antwort ist auch nicht korrekt.
DKroot
2

Einige werden Sie auffordern, libuser (für 'lid') oder members (für 'members') zu installieren. Aufbauend auf der Antwort https://unix.stackexchange.com/a/349648/77959, die dieses Problem mit der Mitgliedschaft in einer Anmeldegruppe behandelte, stellte ich fest, dass eine andere Gruppe nicht von diesem Skript abgedeckt wird. Also - hier ist das Beste aus beiden Ansätzen zusammen:

#!/bin/bash
if [ $# -eq 1 ]; then
        list_a=`cut -d: -f1,4 /etc/passwd | grep $(getent group "$1"| cut -d: -f3) | cut -d: -f1`
        list_b=`getent group "$1"|cut -d: -f4|sed 's/,/\n/g'`
        echo -e "$list_a\n$list_b"|grep -v "^$"|sort|uniq
else
        echo "pass me a group to find the members of"
fi
flowtron
quelle
Es funktionierte korrekt auf meinem System im Gegensatz zu Antworten mit getentoder grep'^group_name_here:' /etc/group
DKroot
0

Diese Änderung des Ansatzes von user3717722 listet Gruppenmitglieder in einer NIS-Datenbank auf:

ypcat passwd | cut -d: -f1,4 | grep $(getent group <groupname> | cut -d: -f3) | cut -d: -f1
Holger Försterling
quelle