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'

Jess Louise
fonte
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.

ARG
fonte
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.

Murray Jensen
fonte
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)

ZN13
fonte
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.

user198963
fonte
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á.

Alex
fonte
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>
Kadir
fonte
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.

Thomas Dickey
fonte
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
Bhavik
fonte
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
flowtron
fonte
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
Holger Foersterling
fonte