Come faccio a sapere quali utenti fanno parte di un gruppo in Linux?


68

Di recente ho creato nuovi utenti e li ho assegnati a determinati gruppi. Mi chiedevo se esiste un comando che mostra tutti gli utenti assegnati a un determinato gruppo? Ho provato a usare il comando 'gruppi' tuttavia ogni volta che lo uso dice 'gruppi: non trovato'


3
Questo è il groupscomando. È improbabile che tu non lo abbia su Linux, poiché fa parte di coreutils.
Thomas Dickey,

@ThomasDickey Ma è possibile - come su alcuni NAS.
Thomas W.

Risposte:


43

Puoi usare grep:

grep '^group_name_here:' /etc/group

Questo elenca solo le appartenenze a gruppi supplementari, non l'utente che ha questo gruppo come gruppo principale. E trova solo gruppi locali, non gruppi da un servizio di rete come LDAP.


6
Non funziona con l'autenticazione centralizzata.
Maxim Egorushkin,

1
Questo potrebbe essere davvero fonte di confusione probabilmente a causa della differenza primaria / secondaria. Penso che questo dovrebbe essere evitato a favore di sudo lid -g {group}. Ho un sistema in cui questa risposta elenca 8 utenti in un gruppo mentre sudo lid -g {group}elenca 10.
DKroot

Vedi la getentrisposta di @Murray Jensen in basso
scrutari il

84

Preferisco usare il comando getent ...

Poiché getent utilizza lo stesso servizio di denominazione del sistema, getent mostrerà tutte le informazioni, comprese quelle ottenute da fonti di informazioni di rete come LDAP.

Quindi, per un gruppo, dovresti usare il seguente ...

getent group name_of_group

dove name_of_group viene sostituito con il gruppo che si desidera cercare. Nota che questo restituisce solo appartenenze a gruppi supplementari, non include gli utenti che hanno questo gruppo come gruppo principale.

Ci sono molte altre ricerche che puoi fare ... passwdessendo un'altra utile, che dovrai elencare i gruppi primari.


1
Le altre risposte non si applicano se non si è amministratori e le informazioni sul gruppo sono memorizzate in un altro server.
Andrés Alcarraz,

1
Questo potrebbe essere davvero fonte di confusione probabilmente a causa della differenza primaria / secondaria. Penso che questo dovrebbe essere evitato a favore di sudo lid -g {group}. Ho un sistema in cui questa risposta elenca 8 utenti in un gruppo mentre sudo lid -g {group}elenca 10.
DKroot

12

Più facile da fare groups [username]

Se vuoi elencare tutti gli utenti locali e i loro gruppi locali, puoi farlo

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

Se ottieni "gruppi: comando non trovato", è probabile che tu abbia modificato il tuo percorso ambientale in peggio, per ripristinare il tuo percorso PATH=$(getconf PATH)


Funziona per un determinato gruppo se | grep {group}viene aggiunto e fornisce la risposta corretta a differenza di getent group name_of_groupogrep '^group_name_here:' /etc/group
DKroot,

1
Invece di cat /etc/passwd, dovresti usare gentent passwdcosì gli utenti in nis / ldap verrebbero comunque elencati. L'unico inconveniente è che può richiedere parecchio tempo.
Brian Minton il

8
groupmems -g nome gruppo -l

elenca tutti gli utenti nel gruppo indicato.


Nota che groupmemsfa parte dei programmi di utilità ombra usati sulla maggior parte delle distribuzioni Linux, tuttavia groupmemsè attualmente assente da Debian e derivati ​​(un bug ora risolto ma non ancora incluso in nessuna versione (a partire da novembre 2016))
Stéphane Chazelas

2
Si noti inoltre che groupmemsriguarda solo i gruppi /etc/group(non quelli nel LDAP o in altri database utente) e richiede i privilegi di superutente nel tentativo di aprire / etc / gshadow.
Stéphane Chazelas,

Nonostante le avvertenze sopra menzionate, questo comando è ideale per determinate situazioni perché non richiede un'analisi aggiuntiva dell'output (ad es. cutE amici).
bonh,

Questo potrebbe essere davvero fonte di confusione probabilmente a causa della differenza primaria / secondaria. Penso che questo dovrebbe essere evitato a favore di sudo lid -g {group}. Ho un sistema in cui questa risposta elenca 8 utenti in un gruppo mentre sudo lid -g {group}elenca 10.
DKroot

5

Sono sorpreso che nessuno abbia menzionato

id <user>

Questo comando fornirà un elenco di gruppi in cui si trova l'utente.


3
Perché - contrariamente al titolo - l'interrogante voleva conoscere gli utenti all'interno di un determinato gruppo, non i gruppi di un determinato utente, come dettagliato nella domanda. Ora ho riformulato il titolo in modo che corrisponda al contenuto.
Dubu,

Aaah, capisco. Avrei dovuto leggere meglio il testo della domanda. Grazie.
Alex,

4

groupscomando stampa le appartenenze ai gruppi per un utente. Puoi usare il lidcomando per elencare gli utenti in un gruppo come:

# lid -g <groupname>

4
lidfa parte di libuser, che non è installato di default su molte distribuzioni.
Chris Down,

2

OP ha formulato la domanda per escludere la possibilità di utilizzare il comando gruppi . Dal momento che fa parte dei coreutils su Linux, (a) è stato rimosso o (b) OP sta digitando male il nome.

OP avrebbe potuto usare in groupsquesto modo, ad esempio:

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

Una risposta suggerita è solo grep's per il nome del gruppo in /etc/group. A volte funziona come previsto.

Un uso leggermente migliore di grep tiene conto della sintassi di /etc/group:

group_name:password:GID:user_list

in modo che solo la parte prima dei primi due punti sia un nome di gruppo valido. Un semplice grep, indipendentemente dalla sintassi, può (e vuole) raccogliere partite fuorvianti dal file. Usa le espressioni regolari per far corrispondere al grep esattamente ciò che è necessario:

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

o usando una variabile di shell:

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

Tuttavia, questo elenca solo quelli che non fanno parte di un gruppo predefinito . Per aggiungere quelli , è necessario prendere in considerazione il file delle password, ad esempio, estraendo il numero del gruppo-id da /etc/group, e la stampa gli utenti il cui gruppo di default partite da /etc/passwd, ad esempio,

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

Puoi fare la stessa cosa usando solo grep e sed, ma è più lavoro che usare awk.

Un'altra risposta suggerita è stata proposta usando getent, che probabilmente si troverà su una macchina Linux (con Debian, fa parte di GNU libc). Tuttavia, un rapido controllo di ciò mostra che fornisce solo il /etc/groupcontenuto.

Io (come la maggior parte) non ho libuserso lidinstallato, quindi non posso commentare se soddisfa le condizioni di OP.

C'è anche il idprogramma, che fornisce informazioni di gruppo. Qualcuno potrebbe espandersi su questo come una possibile risposta.


O semplicemente, sed -n "s/^$groupname:.*://p" /etc/groupma ciò potrebbe comunque riportare risultati errati se il nome del gruppo contiene operatori RE ( .ad esempio non è raro nei nomi di gruppo).
Stéphane Chazelas,

GNU getentinterrogherà anche LDAP / NIS ... anche se probabilmente non quando l'enumerazione è esplicitamente disabilitata per il database di gruppo.
Stéphane Chazelas,

Si noti che groupsnon sarebbe di aiuto in quanto elenca i gruppi di cui un determinato utente è membro rispetto all'elenco dei membri di un determinato gruppo.
Stéphane Chazelas,

2

Funziona come un fascino:

cut -d: -f1,4 /etc/passwd | grep $(getent group <groupname> | cut -d: -f3) | cut -d: -f1

A differenza della risposta accettata da @ARG, questo comando elenca gli utenti che hanno <groupname> come gruppo principale
Bhavik

questa dovrebbe essere la risposta accettata
Nikolay Nenov,

1
Non sono d'accordo. Poiché legge gli utenti in / etc / passwd, non funzionerà con altri moduli nsswitch che accedono a LDAP ecc.
Ivan Vučica,

Non ha funzionato correttamente per me: ho ottenuto 4 membri in un gruppo mentre gli sudo lid -gelenchi 8. @Bhavik La risposta accettata non è neanche corretta.
DKroot,

2

Alcuni ti diranno di installare libuser (per 'lid') o membri (per 'membri'). Ma basandomi sulla risposta https://unix.stackexchange.com/a/349648/77959 che ha gestito questo problema con l'appartenenza al gruppo di accesso, ho scoperto che un altro gruppo non era coperto da quello script. Quindi, ecco il meglio di entrambi gli approcci combinati:

#!/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

Ha funzionato correttamente sul mio sistema a differenza delle risposte che coinvolgono getento grep'^group_name_here:' /etc/group
DKroot,

0

Questa modifica dell'approccio user3717722 elencherà i membri del gruppo in un database NIS:

ypcat passwd | cut -d: -f1,4 | grep $(getent group <groupname> | cut -d: -f3) | cut -d: -f1
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.