@ Silmari89, Nie, jeśli chce to zrobić programowo.
Paul Tomblin
2
Jestem tu nowy, dowiedziałem się, że SF istnieje zaraz po tym, jak opublikowałem pytanie. Zgadzam się, że należy do SF lub SO.
user323094
5
Heh, oczywiście, teraz ma programowe rozwiązanie, więc i tutaj może być uzasadnione.
Zed
Odpowiedzi:
103
Niestety, nie ma dobrego, przenośnego sposobu na zrobienie tego, o czym wiem. Jeśli spróbujesz parsować plik / etc / group, jak sugerują inni, przegapisz użytkowników, którzy mają tę grupę jako grupę podstawową, oraz każdego, kto został dodany do tej grupy za pomocą mechanizmu innego niż pliki płaskie UNIX (tj. LDAP, NIS, pam-pgsql itp.).
Gdybym absolutnie musiał to zrobić sam, prawdopodobnie zrobiłbym to w odwrotnym kierunku: użyj, idaby uzyskać grupy każdego użytkownika w systemie (który ściągnie wszystkie źródła widoczne dla NSS), i użyj Perla lub czegoś podobnego do utrzymania skrótu tabela dla każdej wykrytej grupy z podaniem członkostwa tego użytkownika.
Edycja: Oczywiście pozostawia to podobny problem: jak uzyskać listę każdego użytkownika w systemie. Ponieważ moja lokalizacja używa tylko płaskich plików i LDAP, mogę po prostu uzyskać listę z obu lokalizacji, ale może to być prawda lub nie dla twojego środowiska.
Edycja 2: Ktoś przechodzący przypomniał mi, że getent passwdzwróci listę wszystkich użytkowników w systemie, w tym użytkowników z LDAP / NIS / itp., Alegetent group nadal będzie tęsknił za użytkownikami będącymi członkami tylko poprzez domyślny wpis grupy, więc zainspirowało mnie to do napisz ten szybki hack.
Dziękujemy wszystkim, którzy odpowiedzieli. Szukałem przenośnego sposobu na zrobienie tego. Twoja informacja, że nie ma łatwego i przenośnego sposobu, była pomocna. Uściśliłeś również najbardziej okoliczności, które pomogły mi głębiej zrozumieć problem, doceniam to i wybrałem twoją odpowiedź jako zaakceptowaną.
user323094
2
Czy byłoby możliwe przekazanie skryptu fundacji Linux? Jest rok 2012 i nadal nie ma łatwego sposobu na pozyskanie członków grupy. Właśnie to frustruje mnie w Linuksie.
winteck
6
Dodałem dla ciebie licencję podobną do ISC, która powinna być kompatybilna z prawie każdą grupą. Prześlij go w dowolnym miejscu, w którym uważasz, że zostanie zaakceptowane.
Zed
PAM nie podaje informacji o koncie. To robi przełącznik usługi nazw (nsswitch), który to robi. Nie wszystkie „bazy danych” (dostawcy danych) obsługują wyliczanie, więc getent passwdmogą nie działać (jeśli na przykład używasz sssd).
Ważny punkt dotyczący PAM vs NSS - zmieniłem odniesienie. Chociaż go nie użyłem, sssd na pierwszy rzut oka wygląda jak zamiennik nscd, a nie odpowiedni dostawca danych, a jeśli się zepsuje getent passwd, uznałbym to za błąd w sssd.
Zed
239
getent group <groupname>;
Jest przenośny zarówno w systemie Linux, jak i Solaris i współpracuje z lokalnymi plikami grup / haseł, konfiguracjami NIS i LDAP.
Byłby to najpiękniejszy sposób, z wyjątkiem tego, że lid nie jest w standardowej instalacji Debiana. W Ubuntu jest w opcjonalnym pakiecie libuser (nie jest to ten w id-utils o tej samej nazwie). Nie znalazłem go w Debianie :(
user323094,
Pracowałem dla mnie w Scientific Linux
blong
na Debianie Wheezy, lid jest również na pakiecie libuser
Lluís
2
@JohnMcGehee RHEL powinien był nazywać się AustereLinux
goelakash,
1
„-g” nie jest dla mnie opcją. Mam wersję id-utils 4.6 zainstalowaną na Ubuntu 16.04.
Wilson Biggs,
25
Następujące polecenie wyświetli listę wszystkich użytkowników należących do <your_group_name>, ale tylko tych zarządzanych przez /etc/groupbazę danych, a nie LDAP, NIS itp. Działa również tylko dla grup drugorzędnych , nie wyświetli listy użytkowników, dla których ta grupa jest ustawiona jako podstawowa, ponieważ grupa podstawowa to przechowywane jako GID(numeryczny identyfikator grupy) w pliku /etc/passwd.
Możesz grep bezpośrednio do tego pliku, takiego jak grep <nazwa użytkownika> / etc / group. Szybszy i mniejszy narzut.
paintbox
16
Następujące polecenie wyświetli listę wszystkich użytkowników należących do <your_group_name>, ale tylko tych zarządzanych przez /etc/groupbazę danych, a nie LDAP, NIS itp. Działa również tylko dla grup drugorzędnych , nie wyświetli listy użytkowników, dla których ta grupa jest ustawiona jako podstawowa, ponieważ grupa podstawowa to przechowywane jako GID(numeryczny identyfikator grupy) w pliku /etc/passwd.
Nie pokazuje użytkowników, którzy mają grupę jako grupę domyślną.
rlpowell
3
Nie sprawdza NIS i LDAP.
Paweł Nadolski
12
Poniższy skrypt powłoki wykona iterację przez wszystkich użytkowników i wydrukuje tylko te nazwy użytkowników, które należą do danej grupy:
#!/usr/bin/env bash
getent passwd | while IFS=: read name trash
do
groups $name 2>/dev/null | cut -f2 -d: | grep -i -q -w "$1" && echo $name
done
true
Przykład użycia:
./script 'DOMAIN+Group Name'
Uwaga: To rozwiązanie sprawdzi NIS i LDAP dla użytkowników i grup (nie tylko passwdi grouppliki). Uwzględnia również użytkowników, którzy nie zostali dodani do grupy, ale ustawili ją jako grupę podstawową.
Edycja: Dodano poprawkę do rzadkiego scenariusza, w którym użytkownik nie należy do grupy o tej samej nazwie.
Edycja: napisane w formie skryptu powłoki; dodano, trueaby wyjść ze 0statusem sugerowanym przez @Max Chernyak aka hakunin ; odrzucane stderr, aby czasami je pominąć groups: cannot find name for group ID xxxxxx.
Jest to świetne i bardzo zwięzłe, ale drukuje zarówno nazwę grupy, jak i nazwy użytkowników
andrew lorien
@andrewlorien, mam nadzieję, że rozwiązałem problem, o którym wspomniałeś, jeśli nie, podaj więcej szczegółów.
Paweł Nadolski,
Ten fragment kodu jest dobry, ale zwraca kod wyjścia 1, czy jest jakiś powód, dla którego nie zwraca 0? Może łatwa naprawa?
Max Chernyak
@ hakunin, nie zwraca 0, gdy ostatnia nazwa użytkownika nie należy do grupy. Możesz dołączyć „|| true” na końcu instrukcji, aby zawsze otrzymać 0, jeśli tego właśnie chcesz. Następnie możesz sprawdzić dane wyjściowe, aby sprawdzić, czy znaleziono dowolnego użytkownika.
Paweł Nadolski
@ PawełNadolski Zdałem sobie sprawę, więc ostatecznie dodałem ; true. Zwrócenie 0 jest dobre, aby uniknąć wyzwolenia systemu zarządzania konfiguracją (Chef, Ansible itp.).
Zastrzeżenie: grepdopasuje użytkownika, którego nazwa zawiera numer grupy (np. sc0ttBędzie wyświetlana jako część rootgrupy). Jeśli jest to problem, użyj wyrażenia regularnego :$(getent group <groupname> | cut -d: -f3)\$(pasuje do średnika, identyfikatora grupy i końca linii). (Nie dodawaj cudzysłowów do wyrażenia regularnego, ani bash narzeka.)
Scott Stevens
@ScottS A leg pit-fall. Poleciłbym sugerowane kroki
Potwierdzono pracę na Solarisie 10 po zmianie id -Gnna/usr/xpg4/bin/id -G -n
user667489,
3
Zrobiłem to podobnie do powyższego kodu perla, ale zastąpiłem getent i id natywnymi funkcjami perla. Jest o wiele szybszy i powinien działać w różnych smakach * nix.
#!/usr/bin/env perl
use strict;
my $arg=shift;
my %groupMembers; # defining outside of function so that hash is only built once for multiple function calls
sub expandGroupMembers{
my $groupQuery=shift;
unless (%groupMembers){
while (my($name,$pass,$uid,$gid,$quota,$comment,$gcos,$dir,$shell,$expire)=getpwent()) {
my $primaryGroup=getgrgid($gid);
$groupMembers{$primaryGroup}->{$name}=1;
}
while (my($gname,$gpasswd,$gid,$members)=getgrent()) {
foreach my $member (split / /, $members){
$groupMembers{$gname}->{$member}=1;
}
}
}
my $membersConcat=join(",",sort keys %{$groupMembers{$groupQuery}});
return "$membersConcat" || "$groupQuery Does have any members";
}
print &expandGroupMembers($arg)."\n";
Odpowiedź zawierająca tylko łącze nie jest uważana za dobrą odpowiedź w przypadku przepełnienia stosu. Proszę rozważyć usunięcie tego, ponieważ nie daje to odpowiedzi na pytanie ani nie wyjaśnia, w jaki sposób ta odpowiedź jest lepsza niż odpowiedź zaakceptowana. Możesz też dodać to jako komentarz, gdy masz wystarczającą reputację. Zawsze możesz komentować własne posty.
Dipen Shah,
2
Istnieje przydatny pakiet Debian i Ubuntu o nazwie „ członkowie ”, który zapewnia tę funkcjonalność:
Opis: pokazuje członków grupy; domyślnie wszyscy członkowie są uzupełnieniem grup: podczas gdy grupy pokazują grupy, do których należy określony użytkownik, członkowie pokazują użytkowników należących do określonej grupy.
... Możesz poprosić o członków pierwotnych, członków drugorzędnych, oba w jednym wierszu, każdy w osobnych wierszach.
Oto skrypt, który zwraca listę użytkowników z / etc / passwd i / etc / group, nie sprawdza NIS ani LDAP, ale pokazuje użytkowników, którzy mają grupę jako grupę domyślną Testowane na Debianie 4.7 i solaris 9
#!/bin/bash
MYGROUP="user"
# get the group ID
MYGID=`grep $MYGROUP /etc/group | cut -d ":" -f3`
if [[ $MYGID != "" ]]
then
# get a newline-separated list of users from /etc/group
MYUSERS=`grep $MYGROUP /etc/group | cut -d ":" -f4| tr "," "\n"`
# add a newline
MYUSERS=$MYUSERS$'\n'
# add the users whose default group is MYGROUP from /etc/passwod
MYUSERS=$MYUSERS`cat /etc/passwd |grep $MYGID | cut -d ":" -f1`
#print the result as a newline-separated list with no duplicates (ready to pass into a bash FOR loop)
printf '%s\n' $MYUSERS | sort | uniq
fi
lub jako linijka możesz wycinać i wklejać stąd (zmień nazwę grupy w pierwszej zmiennej)
W UNIX (w przeciwieństwie do GNU / Linux) dostępna jest komenda listusers. Listusers można znaleźć na stronie podręcznika Solaris .
Zauważ, że to polecenie jest częścią projektu Heirloom Open Source . Zakładam, że brakuje go w GNU / Linux, ponieważ RMS nie wierzy w grupy i uprawnienia. :-)
Chociaż ten link może odpowiedzieć na pytanie, lepiej jest dołączyć tutaj istotne części odpowiedzi i podać link w celach informacyjnych. Odpowiedzi zawierające tylko łącze mogą stać się nieprawidłowe, jeśli połączona strona ulegnie zmianie. - Z recenzji
knuhol,
NAME listusers - print a list of user logins SYNOPSIS listusers [-g groups] [-l logins] DESCRIPTION Listusers prints the name and the gecos information of all users known to the system, sorted by username. Valid options are: -g groups Only print the names of users that belong to the given group. Multiple groups are accepted if separated by commas. -l logins Print only user names that match logins. Multiple user names are accepted if separated by commas.
Alun Carr
Ze strony internetowej Heirloom Project: Heirloom Project zapewnia tradycyjne implementacje standardowych narzędzi uniksowych. W wielu przypadkach pochodzą one z oryginalnego materiału uniksowego wydanego jako Open Source przez Calderę i Sun. Interfejsy są zgodne z tradycyjną praktyką; pozostają one ogólnie kompatybilne z Systemem V, chociaż czasami udostępniane są rozszerzenia, które z czasem stały się powszechne. Większość narzędzi znajduje się również w wariancie, którego celem jest zgodność z POSIX.
Alun Carr
0
Oto bardzo prosty skrypt awk, który uwzględnia wszystkie typowe pułapki wymienione w innych odpowiedziach:
getent passwd | awk -F: -v group_name="wheel" '
BEGIN {
"getent group " group_name | getline groupline;
if (!groupline) exit 1;
split(groupline, groupdef, ":");
guid = groupdef[3];
split(groupdef[4], users, ",");
for (k in users) print users[k]
}
$4 == guid {print $1}'
Używam tego z moją konfiguracją z obsługą ldap, działa na każdym sprzęcie zgodnym ze standardami getent & awk, w tym Solaris 8+ i HPux.
Myślę, że najprostszym sposobem są następujące kroki, nie trzeba instalować żadnego pakietu ani oprogramowania:
Najpierw dowiadujesz się o GID grupy, którą chcesz znać użytkowników, jest na to wiele sposobów:
cat / etc / group (ostatnia kolumna to GID)
id użytkownik (użytkownik to ktoś, kto należy do Grupa)
Teraz wyświetlisz listę wszystkich użytkowników w pliku / etc / passwd, ale zastosujesz niektóre filtry z następującą sekwencją poleceń, aby uzyskać tylko członków poprzedniej grupy.
cut -d: -f1,4 / etc / passwd | grep GID (GID to liczba uzyskana z kroku 1)
polecenie cut wybierze tylko niektóre „kolumny” pliku, parametr d ustawia ogranicznik „:” w tym przypadku parametr -f wybiera „pola” (lub kolumny), które mają być pokazane 1 i 4 w przypadku (na plik / etc / passwd, kolumna 1º to nazwa użytkownika, a 4º to GID grupy, do której należy użytkownik), aby sfinalizować GID | grep filtruje tylko grupę (w kolumnie 4º), którą wybrał.
Oto kolejna linijka Pythona, która uwzględnia domyślne członkostwo użytkownika w grupie (od /etc/passwd), a także z bazy danych grupy ( /etc/group)
python -c "import grp,pwd; print set(grp.getgrnam('mysupercoolgroup')[3]).union([u[0] for u in pwd.getpwall() if u.pw_gid == grp.getgrnam('mysupercoolgroup')[2]])"
Grepping /etc/groupjest już w co najmniej 3 innych odpowiedziach, jaką wartość dodaje do nich twoja odpowiedź? Ponadto wszystkie pozostałe odpowiedzi mają komentarze, że takie rozwiązanie działa tylko dla grup drugorzędnych, a także nie działa dla konta zarządzanego przez LDAP, NIS itp.
Odpowiedzi:
Niestety, nie ma dobrego, przenośnego sposobu na zrobienie tego, o czym wiem. Jeśli spróbujesz parsować plik / etc / group, jak sugerują inni, przegapisz użytkowników, którzy mają tę grupę jako grupę podstawową, oraz każdego, kto został dodany do tej grupy za pomocą mechanizmu innego niż pliki płaskie UNIX (tj. LDAP, NIS, pam-pgsql itp.).
Gdybym absolutnie musiał to zrobić sam, prawdopodobnie zrobiłbym to w odwrotnym kierunku: użyj,
id
aby uzyskać grupy każdego użytkownika w systemie (który ściągnie wszystkie źródła widoczne dla NSS), i użyj Perla lub czegoś podobnego do utrzymania skrótu tabela dla każdej wykrytej grupy z podaniem członkostwa tego użytkownika.Edycja: Oczywiście pozostawia to podobny problem: jak uzyskać listę każdego użytkownika w systemie. Ponieważ moja lokalizacja używa tylko płaskich plików i LDAP, mogę po prostu uzyskać listę z obu lokalizacji, ale może to być prawda lub nie dla twojego środowiska.
Edycja 2: Ktoś przechodzący przypomniał mi, że
getent passwd
zwróci listę wszystkich użytkowników w systemie, w tym użytkowników z LDAP / NIS / itp., Alegetent group
nadal będzie tęsknił za użytkownikami będącymi członkami tylko poprzez domyślny wpis grupy, więc zainspirowało mnie to do napisz ten szybki hack.źródło
getent passwd
mogą nie działać (jeśli na przykład używasz sssd).getent passwd
, uznałbym to za błąd w sssd.Jest przenośny zarówno w systemie Linux, jak i Solaris i współpracuje z lokalnymi plikami grup / haseł, konfiguracjami NIS i LDAP.
źródło
Użyj Pythona, aby wyświetlić członków grupy:
Zobacz https://docs.python.org/2/library/grp.html
źródło
źródło
Następujące polecenie wyświetli listę wszystkich użytkowników należących do
<your_group_name>
, ale tylko tych zarządzanych przez/etc/group
bazę danych, a nie LDAP, NIS itp. Działa również tylko dla grup drugorzędnych , nie wyświetli listy użytkowników, dla których ta grupa jest ustawiona jako podstawowa, ponieważ grupa podstawowa to przechowywane jakoGID
(numeryczny identyfikator grupy) w pliku/etc/passwd
.źródło
Następujące polecenie wyświetli listę wszystkich użytkowników należących do
<your_group_name>
, ale tylko tych zarządzanych przez/etc/group
bazę danych, a nie LDAP, NIS itp. Działa również tylko dla grup drugorzędnych , nie wyświetli listy użytkowników, dla których ta grupa jest ustawiona jako podstawowa, ponieważ grupa podstawowa to przechowywane jakoGID
(numeryczny identyfikator grupy) w pliku/etc/passwd
.źródło
Poniższy skrypt powłoki wykona iterację przez wszystkich użytkowników i wydrukuje tylko te nazwy użytkowników, które należą do danej grupy:
Przykład użycia:
Uwaga: To rozwiązanie sprawdzi NIS i LDAP dla użytkowników i grup (nie tylko
passwd
igroup
pliki). Uwzględnia również użytkowników, którzy nie zostali dodani do grupy, ale ustawili ją jako grupę podstawową.Edycja: Dodano poprawkę do rzadkiego scenariusza, w którym użytkownik nie należy do grupy o tej samej nazwie.
Edycja: napisane w formie skryptu powłoki; dodano,
true
aby wyjść ze0
statusem sugerowanym przez @Max Chernyak aka hakunin ; odrzucanestderr
, aby czasami je pominąćgroups: cannot find name for group ID xxxxxx
.źródło
; true
. Zwrócenie 0 jest dobre, aby uniknąć wyzwolenia systemu zarządzania konfiguracją (Chef, Ansible itp.).Możesz to zrobić w jednym wierszu poleceń:
Powyższe polecenie wyświetla listę wszystkich użytkowników, których nazwa grupy jest grupą podstawową
Jeśli chcesz również wymienić użytkowników mających nazwę grupy jako grupę drugorzędną, użyj następującego polecenia
źródło
grep
dopasuje użytkownika, którego nazwa zawiera numer grupy (np.sc0tt
Będzie wyświetlana jako częśćroot
grupy). Jeśli jest to problem, użyj wyrażenia regularnego:$(getent group <groupname> | cut -d: -f3)\$
(pasuje do średnika, identyfikatora grupy i końca linii). (Nie dodawaj cudzysłowów do wyrażenia regularnego, ani bash narzeka.)tylko trochę grep i tr:
źródło
Implementacja Zeda powinna prawdopodobnie zostać rozszerzona na niektóre inne ważne systemy UNIX.
Czy ktoś ma dostęp do sprzętu Solaris lub HP-UX ?; nie testowałem tych przypadków.
Jeśli istnieje lepszy sposób podzielenia się tą sugestią, daj mi znać; Rozważyłem wiele sposobów i właśnie to wymyśliłem.
źródło
id -Gn
na/usr/xpg4/bin/id -G -n
Zrobiłem to podobnie do powyższego kodu perla, ale zastąpiłem getent i id natywnymi funkcjami perla. Jest o wiele szybszy i powinien działać w różnych smakach * nix.
źródło
Istnieje przydatny pakiet Debian i Ubuntu o nazwie „ członkowie ”, który zapewnia tę funkcjonalność:
źródło
Zwraca rozdzieloną spacjami listę użytkowników, których użyłem w skryptach do zapełniania tablic.
lub
źródło
Oto skrypt, który zwraca listę użytkowników z / etc / passwd i / etc / group, nie sprawdza NIS ani LDAP, ale pokazuje użytkowników, którzy mają grupę jako grupę domyślną Testowane na Debianie 4.7 i solaris 9
lub jako linijka możesz wycinać i wklejać stąd (zmień nazwę grupy w pierwszej zmiennej)
źródło
W UNIX (w przeciwieństwie do GNU / Linux) dostępna jest komenda listusers. Listusers można znaleźć na stronie podręcznika Solaris .
Zauważ, że to polecenie jest częścią projektu Heirloom Open Source . Zakładam, że brakuje go w GNU / Linux, ponieważ RMS nie wierzy w grupy i uprawnienia. :-)
źródło
NAME listusers - print a list of user logins SYNOPSIS listusers [-g groups] [-l logins] DESCRIPTION Listusers prints the name and the gecos information of all users known to the system, sorted by username. Valid options are: -g groups Only print the names of users that belong to the given group. Multiple groups are accepted if separated by commas. -l logins Print only user names that match logins. Multiple user names are accepted if separated by commas.
Oto bardzo prosty skrypt awk, który uwzględnia wszystkie typowe pułapki wymienione w innych odpowiedziach:
Używam tego z moją konfiguracją z obsługą ldap, działa na każdym sprzęcie zgodnym ze standardami getent & awk, w tym Solaris 8+ i HPux.
źródło
Składa się z 3 części:
1 -
getent group groupname
pokazuje linię grupy w pliku „/ etc / group”. Alternatywa dlacat /etc/group | grep groupname
.2 -
awk
print to tylko elementy w jednym wierszu z oddzielnym „,”.3 -
tr
zamień „,” na nowy wiersz i wypisz każdego użytkownika z rzędu.4 - Opcjonalnie: Możesz również użyć innej rury
sort
, jeśli użytkowników jest zbyt wielu.pozdrowienia
źródło
Myślę, że najprostszym sposobem są następujące kroki, nie trzeba instalować żadnego pakietu ani oprogramowania:
Najpierw dowiadujesz się o GID grupy, którą chcesz znać użytkowników, jest na to wiele sposobów: cat / etc / group (ostatnia kolumna to GID) id użytkownik (użytkownik to ktoś, kto należy do Grupa)
Teraz wyświetlisz listę wszystkich użytkowników w pliku / etc / passwd, ale zastosujesz niektóre filtry z następującą sekwencją poleceń, aby uzyskać tylko członków poprzedniej grupy.
cut -d: -f1,4 / etc / passwd | grep GID (GID to liczba uzyskana z kroku 1)
polecenie cut wybierze tylko niektóre „kolumny” pliku, parametr d ustawia ogranicznik „:” w tym przypadku parametr -f wybiera „pola” (lub kolumny), które mają być pokazane 1 i 4 w przypadku (na plik / etc / passwd, kolumna 1º to nazwa użytkownika, a 4º to GID grupy, do której należy użytkownik), aby sfinalizować GID | grep filtruje tylko grupę (w kolumnie 4º), którą wybrał.
źródło
Oto kolejna linijka Pythona, która uwzględnia domyślne członkostwo użytkownika w grupie (od
/etc/passwd
), a także z bazy danych grupy (/etc/group
)źródło
Próbowałem
grep 'sample-group-name' /etc/group
, aby wyświetlić listę wszystkich członków grupy, którą określiłeś na podstawie przykładu tutajźródło
/etc/group
jest już w co najmniej 3 innych odpowiedziach, jaką wartość dodaje do nich twoja odpowiedź? Ponadto wszystkie pozostałe odpowiedzi mają komentarze, że takie rozwiązanie działa tylko dla grup drugorzędnych, a także nie działa dla konta zarządzanego przez LDAP, NIS itp.