Jak mogę dowiedzieć się, którzy użytkownicy są w grupie w systemie Linux?

67

Ostatnio tworzyłem nowych użytkowników i przypisywałem ich do niektórych grup. Zastanawiałem się, czy istnieje polecenie, które pokazuje wszystkich użytkowników przypisanych do określonej grupy? Próbowałem użyć polecenia „grupy”, ale za każdym razem, gdy go używam, mówi „grupy: nie znaleziono”

Jess Louise
źródło
3
To jest groupsrozkaz. Jest mało prawdopodobne, że nie masz go w systemie Linux, ponieważ jest on częścią coreutils.
Thomas Dickey,
@ThomasDickey Ale to możliwe - jak na niektórych serwerach NAS.
Thomas W.

Odpowiedzi:

43

Możesz użyć grep:

grep '^group_name_here:' /etc/group

Zawiera tylko dodatkowe członkostwa w grupach, a nie użytkownika, który ma tę grupę jako grupę podstawową. I znajduje tylko grupy lokalne, a nie grupy z usługi sieciowej, takiej jak LDAP.

ARG
źródło
6
Nie działa ze scentralizowanym uwierzytelnianiem.
Maxim Egorushkin
1
To może być naprawdę mylące, prawdopodobnie z powodu różnicy pierwotnej / wtórnej. Myślę, że należy tego unikać na korzyść. Mam sudo lid -g {group}system, w którym ta odpowiedź wymienia 8 użytkowników w grupie, podczas gdy sudo lid -g {group}listy 10.
DKroot
Zobacz getentodpowiedź @Murray Jensen poniżej
scrutari
83

Wolę użyć polecenia getent ...

Ponieważ getent używa tej samej usługi nazw co system, getent pokaże wszystkie informacje, w tym uzyskane z sieciowych źródeł informacji, takich jak LDAP.

W przypadku grupy należy użyć następujących ...

getent group name_of_group

gdzie nazwa_grupy jest zastąpiona grupą, którą chcesz wyszukać. Pamiętaj, że to zwraca tylko dodatkowe członkostwo w grupie, nie obejmuje użytkowników, którzy mają tę grupę jako grupę podstawową.

Istnieje wiele innych wyszukiwań, które możesz zrobić ... passwdbędąc kolejnym przydatnym, które musisz wymienić podstawowe grupy.

Murray Jensen
źródło
1
Inne odpowiedzi nie mają zastosowania, jeśli nie jesteś administratorem, a informacje o grupie są przechowywane na innym serwerze.
Andrés Alcarraz
1
To może być naprawdę mylące, prawdopodobnie z powodu różnicy pierwotnej / wtórnej. Myślę, że należy tego unikać na korzyść. Mam sudo lid -g {group}system, w którym ta odpowiedź wymienia 8 użytkowników w grupie, podczas gdy sudo lid -g {group}listy 10.
DKroot
12

Łatwiej to zrobić groups [username]

Jeśli chcesz wyświetlić listę wszystkich lokalnych użytkowników i ich lokalnych grup, możesz to zrobić

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

Jeśli pojawi się komunikat „groups: command not found”, prawdopodobnie zmieniono ścieżkę środowiskową na gorsze, aby zresetować ścieżkę, wykonaj PATH=$(getconf PATH)

ZN13
źródło
Działa dla konkretnej grupy, jeśli | grep {group}zostanie dodany i daje poprawną odpowiedź w przeciwieństwie do getent group name_of_grouplubgrep '^group_name_here:' /etc/group
DKroot
1
Zamiast tego cat /etc/passwdpowinieneś używać, gentent passwdaby użytkownicy w nis / ldap nadal byli na liście. Jedyną wadą jest to, że może to zająć sporo czasu.
Brian Minton
7
groupmems -g nazwa grupy -l

wyświetla listę wszystkich użytkowników w wymienionej grupie.

użytkownik198963
źródło
Zauważ, że groupmemsjest częścią narzędzi cieni używanych w większości dystrybucji Linuksa, jednak groupmemsobecnie nie występuje w Debianie i pochodnych ( błąd został naprawiony, ale nie został jeszcze uwzględniony w żadnym wydaniu (od listopada 2016 r.))
Stéphane Chazelas
2
Zauważ też, że groupmemszajmuje się tylko grupami w /etc/group(nie tymi w LDAP lub innej bazie danych użytkowników) i wymaga uprawnień superużytkownika podczas próby otwarcia / etc / gshadow.
Stéphane Chazelas
Pomimo wspomnianych wyżej zastrzeżeń, to polecenie jest idealne w niektórych sytuacjach, ponieważ nie wymaga dodatkowego analizowania danych wyjściowych (tj. cutPrzyjaciół).
bonh
To może być naprawdę mylące, prawdopodobnie z powodu różnicy pierwotnej / wtórnej. Myślę, że należy tego unikać na korzyść sudo lid -g {group}. Mam system, w którym ta odpowiedź wymienia 8 użytkowników w grupie, podczas gdy sudo lid -g {group}lista 10.
DKroot
5

Dziwię się, że nikt nie wspomniał

id <user>

To polecenie wyświetli listę grup, w których użytkownik jest.

Alex
źródło
3
Ponieważ - wbrew tytułowi - pytający chciał poznać użytkowników w danej grupie, a nie grupy danego użytkownika, jak wyszczególniono w pytaniu. Odtąd sformułowałem tytuł, aby pasował do zawartości.
Dubu,
Rozumiem. Powinienem był lepiej przeczytać tekst pytania. Dzięki.
Alex,
3

groupspolecenie drukuje członkostwa w grupach dla użytkownika. Możesz użyć lidpolecenia, aby wyświetlić listę użytkowników w grupie, takich jak:

# lid -g <groupname>
Kadir
źródło
4
lidjest częścią libuser, który nie jest instalowany domyślnie w wielu dystrybucjach.
Chris Down,
2

OP sformułował pytanie, aby wykluczyć możliwość korzystania z polecenia grup . Ponieważ jest to część coreutils w Linuksie, albo (a) został usunięty, albo (b) OP źle wpisuje nazwę.

OP mógł użyć w groupsnastępujący sposób, na przykład:

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

Jedna sugerowana odpowiedź to po prostu grep dla nazwy grupy w /etc/group. Czasami działa to zgodnie z przeznaczeniem.

Nieco lepsze użycie grep uwzględnia składnię /etc/group:

group_name:password:GID:user_list

tak że tylko część przed pierwszym dwukropkiem jest prawidłową nazwą grupy. Zwykły grep bez względu na składnię może (i będzie) zbierać mylące dopasowania z pliku. Użyj wyrażeń regularnych, aby grep dokładnie pasował do potrzeb:

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

lub używając zmiennej powłoki:

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

Wymienia to jednak tylko te, których nie ma w domyślnej grupie . Aby dodać te , trzeba wziąć pod uwagę pliku haseł, na przykład, przez ekstrakcję identyfikator grupy z /etc/group, i drukowanie użytkowników, których grupa domyślna mecze z /etc/passwdnp

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

Możesz zrobić to samo za pomocą grep i sed, ale jest to więcej pracy niż używanie awk.

Inna sugerowana odpowiedź zaproponowana przy użyciu getent, która również prawdopodobnie znajduje się na komputerze z systemem Linux (w Debianie jest częścią GNU libc). Jednak szybkie sprawdzenie tego pokazuje, że dostarcza tylko /etc/grouptreść.

Ja (jak większość) nie mam libusersani nie lidzainstalowałem, więc nie mogę komentować, czy spełnia warunki OP.

Istnieje również idprogram, który podaje informacje o grupie. Ktoś może rozwinąć tę kwestię jako możliwą odpowiedź.

Thomas Dickey
źródło
Lub po prostu, sed -n "s/^$groupname:.*://p" /etc/groupale może to nadal zgłaszać nieprawidłowe wyniki, jeśli nazwa grupy zawiera operatory RE ( .na przykład nie jest rzadkie w nazwach grup).
Stéphane Chazelas
GNU getentbędzie również sprawdzać LDAP / NIS ... choć może nie, gdy wyliczanie jest wyraźnie wyłączone dla grupowej bazy danych.
Stéphane Chazelas
Zauważ, że groupsto nie pomogłoby, ponieważ zawiera listę grup, do których należy dany użytkownik, w przeciwieństwie do listy członków danej grupy.
Stéphane Chazelas
2

Działa jak marzenie:

cut -d: -f1,4 /etc/passwd | grep $(getent group <groupname> | cut -d: -f3) | cut -d: -f1
Bhavik
źródło
W przeciwieństwie do zaakceptowanej odpowiedzi @ARG, polecenie to wyświetla listę użytkowników mających <nazwa_grupy> jako swoją grupę podstawową
Bhavik
to powinna być zaakceptowana odpowiedź
Nikolay Nenov
1
Nie zgadzam się. Ponieważ odczytuje użytkowników w / etc / passwd, nie będzie to działać z innymi modułami nsswitch, które uzyskują dostęp do LDAP itp.
Ivan Vučica,
Nie działało dla mnie poprawnie: mam 4 członków w grupie, podczas gdy sudo lid -glisty 8. @Bhavik Przyjęta odpowiedź jest nieprawidłowa.
DKroot
2

Niektórzy powiedzą ci, aby zainstalować libuser (dla „lid”) lub członków (dla „członków”). Ale w oparciu o odpowiedź https://unix.stackexchange.com/a/349648/77959, która rozwiązała ten problem z członkostwem w grupie logowania , znalazłem inną grupę nieobjętą tym skryptem. Tak więc - oto najlepsze z obu podejść łącznie:

#!/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
źródło
Działa poprawnie w moim systemie, w przeciwieństwie do odpowiedzi obejmujących getentlub grep'^group_name_here:' /etc/group
DKroot
0

Ta modyfikacja podejścia user3717722 spowoduje wyświetlenie listy członków grupy w bazie danych NIS:

ypcat passwd | cut -d: -f1,4 | grep $(getent group <groupname> | cut -d: -f3) | cut -d: -f1
Holger Foersterling
źródło