Como posso descobrir quais usuários estão em um grupo no Linux?


68

Recentemente, venho criando novos usuários e atribuindo-os a determinados grupos. Eu queria saber se existe um comando que mostra todos os usuários atribuídos a um determinado grupo? Eu tentei usar o comando 'groups' no entanto, sempre que eu uso isso, ele diz 'groups: not found'


3
Esse é o groupscomando. É improvável que você não o tenha no Linux, pois faz parte do coreutils.
Thomas Dickey

@ ThomasDickey Mas é possível - como em alguns NASes.
Thomas W.

Respostas:


43

Você pode usar o grep:

grep '^group_name_here:' /etc/group

Isso lista apenas associações suplementares ao grupo, não o usuário que possui esse grupo como grupo principal. E encontra apenas grupos locais, não grupos de um serviço de rede como LDAP.


6
Não funciona com autenticação centralizada.
Maxim Egorushkin

11
Isso pode ser realmente confuso provavelmente por causa da diferença primária / secundária. Eu acho que isso deve ser evitado em favor de sudo lid -g {group}.I ter um sistema onde este Listas de resposta 8 usuários em um grupo enquanto sudo lid -g {group}listas 10.
DKroot

Veja a getentresposta de @Murray Jensen abaixo
scrutari

84

Eu prefiro usar o comando getent ...

Como o getent usa o mesmo serviço de nome que o sistema, o getent mostrará todas as informações, inclusive as obtidas de fontes de informações de rede, como LDAP.

Portanto, para um grupo, você deve usar o seguinte ...

getent group name_of_group

onde name_of_group é substituído pelo grupo que você deseja procurar. Observe que isso retorna apenas associações suplementares ao grupo, não inclui os usuários que têm esse grupo como grupo principal.

Existem várias outras pesquisas que você pode fazer ... passwdsendo outra útil, que você precisará listar grupos principais.


11
As outras respostas não se aplicam se você não for administrador e as informações do grupo estiverem armazenadas em outro servidor.
Andrés Alcarraz 04/02

11
Isso pode ser realmente confuso provavelmente por causa da diferença primária / secundária. Eu acho que isso deve ser evitado em favor de sudo lid -g {group}.I ter um sistema onde este Listas de resposta 8 usuários em um grupo enquanto sudo lid -g {group}listas 10.
DKroot

12

Mais fácil de fazer groups [username]

Se você deseja listar todos os usuários locais e seus grupos locais, pode fazer

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

Se você receber "groups: command not found", é provável que você tenha editado seu caminho ambiental para piorar, para redefinir seu caminho, faça PATH=$(getconf PATH)


Ele trabalha para um grupo em particular, se | grep {group}é adicionado e dá a resposta correta ao contrário getent group name_of_groupougrep '^group_name_here:' /etc/group
DKroot

11
Em vez de cat /etc/passwd, você deve usar gentent passwdpara que os usuários no nis / ldap ainda sejam listados. A única desvantagem é que pode demorar um pouco.
Brian Minton

8
groupmems -g nome do grupo -l

lista todos os usuários no grupo nomeado.


Note-se que groupmemsfaz parte dos utils sombra usadas na maioria das distribuições Linux, no entanto groupmemsé atualmente ausente do Debian e derivados (um bug agora fixo, mas não incluído em qualquer lançamento ainda (a partir de novembro 2016))
Stéphane Chazelas

2
Observe também que groupmemsapenas lida com grupos /etc/group(não no LDAP ou em outro banco de dados do usuário) e requer privilégios de superusuário enquanto tenta abrir o arquivo / etc / gshadow.
Stéphane Chazelas

Apesar das advertências mencionadas acima, este comando é ideal para determinadas situações porque não requer análise adicional da saída (por exemplo, cutamigos).
bonh

Isso pode ser realmente confuso provavelmente por causa da diferença primária / secundária. Eu acho que isso deve ser evitado em favor de sudo lid -g {group}. Eu tenho um sistema onde esta resposta lista 8 usuários em um grupo enquanto sudo lid -g {group}listas 10.
DKroot

5

Estou surpreso que ninguém mencionou

id <user>

Este comando fornecerá uma lista de grupos em que o usuário está.


3
Porque - ao contrário do título - o questionador queria conhecer os usuários em um determinado grupo, não os grupos de um determinado usuário, conforme detalhado na pergunta. Agora reformulei o título para corresponder ao conteúdo.
Dubu

Aaah, entendo. Eu deveria ter lido melhor o texto da pergunta. Obrigado.
Alex

4

groupsO comando imprime associações de grupo para um usuário. Você pode usar o lidcomando para listar usuários em um grupo como:

# lid -g <groupname>

4
lidfaz parte do libuser, que não é instalado por padrão em muitas distribuições.
Chris #

2

O OP formulou a pergunta para excluir a possibilidade de usar o comando groups . Como isso faz parte do coreutils no Linux, (a) foi removido ou (b) OP está digitando errado o nome.

O OP poderia ter usado groupsassim, por exemplo:

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

Uma resposta sugerida apenas grep é para o nome do grupo no /etc/group. Às vezes, isso funciona como pretendido.

Um uso um pouco melhor do grep leva em consideração a sintaxe de /etc/group:

group_name:password:GID:user_list

para que apenas a parte antes dos primeiros dois pontos seja um nome de grupo válido. Um grep simples, sem levar em conta a sintaxe, pode (e irá) captar correspondências enganosas do arquivo. Use expressões regulares para fazer com que o grep corresponda exatamente ao necessário:

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

ou usando uma variável de shell:

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

No entanto, isso lista apenas aqueles que não estão em um grupo padrão . Para adicioná- los , é necessário levar em consideração o arquivo de senha, por exemplo, extraindo o número de identificação do grupo /etc/groupe imprimindo os usuários cujo grupo padrão corresponde a /etc/passwd, por exemplo,

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

Você poderia fazer a mesma coisa usando apenas grep e sed, mas é mais trabalho do que usar awk.

Outra resposta sugerida foi proposta getent, o que provavelmente também está em uma máquina Linux (com o Debian, faz parte do GNU libc). No entanto, uma verificação rápida mostra que ele fornece apenas o /etc/groupconteúdo.

Eu (como a maioria) não tenho libusersou lidinstalei, portanto não posso comentar se satisfaz as condições do OP.

Há também o idprograma, que fornece informações de grupo. Alguém pode expandir isso como uma possível resposta.


Ou apenas sed -n "s/^$groupname:.*://p" /etc/groupmas isso ainda pode relatar resultados errados se o nome do grupo contiver operadores de ER ( .por exemplo, não é incomum nos nomes de grupos).
Stéphane Chazelas

O GNU getenttambém consultará LDAP / NIS ... embora possivelmente não quando a enumeração for explicitamente desativada para o banco de dados do grupo.
Stéphane Chazelas

Observe que groupsnão ajudaria, pois lista os grupos dos quais um determinado usuário é membro, em oposição à lista de membros de um determinado grupo.
Stéphane Chazelas

2

Funciona como um encanto:

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

Ao contrário da resposta aceita de @ARG, este comando lista os usuários que têm <groupname> como seu grupo primário
Bhavik

esta deve ser a resposta aceita
Nikolay Nenov

11
Discordo. Como ele lê usuários em / etc / passwd, isso não funcionará com outros módulos nsswitch que acessam LDAP etc.
Ivan Vučica

Não funcionou corretamente para mim: eu tenho 4 membros em um grupo, enquanto as sudo lid -glistas 8. @Bhavik A resposta aceita também não está correta.
DKroot

2

Alguns dirão para você instalar o libuser (para 'tampa') ou membros (para 'membros'). Mas, com base na resposta https://unix.stackexchange.com/a/349648/77959, que tratou desse problema com a associação ao grupo de login, encontrei outro grupo que não estava coberto por esse script. Então, aqui está a melhor das duas abordagens combinadas:

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

Funcionou corretamente no meu sistema diferente de respostas envolvendo getentou grep'^group_name_here:' /etc/group
DKroot

0

Essa modificação da abordagem user3717722 listará os membros do grupo em um banco de dados NIS:

ypcat passwd | cut -d: -f1,4 | grep $(getent group <groupname> | cut -d: -f3) | cut -d: -f1
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.