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

46

Recentemente, criei novos usuários e os atribui 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'

    
por Jess Louise 06.11.2015 / 12:48

10 respostas

30

Você pode usar o grep:

grep '^group_name_here:' /etc/group

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

    
por 06.11.2015 / 12:52
61

Eu prefiro usar o comando getent ...

Since getent uses the same name service as the system, getent will show all information, including that gained from network information sources such as LDAP.

Então, para um grupo, você deve usar o seguinte ...

getent group name_of_group

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

Existem muitas outras pesquisas que você pode fazer ... passwd sendo outra útil, que você precisará listar os grupos primários.

    
por 06.11.2015 / 14:14
10

Mais fácil de fazer groups [username]

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

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

Se você receber "grupos: comando não encontrado", é provável que você tenha editado seu caminho ambiental para pior, para redefinir seu caminho do PATH=$(getconf PATH)

    
por 06.11.2015 / 12:55
5
groupmems -g groupname -l

lista todos os usuários no grupo nomeado.

    
por 06.11.2016 / 21:12
2

Estou surpreso que ninguém tenha mencionado

id <user>

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

    
por 09.11.2015 / 07:51
2

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

OP poderia ter usado groups assim, 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 em /etc/group . Às vezes isso funciona como pretendido.

Um uso um pouco melhor de grep leva em conta a sintaxe de /etc/group :

group_name:password:GID:user_list

para que apenas a parte antes dos dois primeiros pontos seja um nome de grupo válido. Um grep simples sem levar em conta a sintaxe pode (e irá) pegar correspondências enganosas do arquivo. Use expressões regulares para fazer com que o grep corresponda exatamente ao que é 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 apenas lista os que não estão em um grupo padrão . Para adicionar aqueles , você precisa levar em conta o arquivo de senha, por exemplo, extraindo o número de identificação do grupo de /etc/group e imprimindo os usuários cujo grupo padrão corresponde de /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 o grep e o sed, mas é mais trabalho do que usar o awk.

Outra resposta sugerida foi proposta usando getent , que também é provável que seja em uma máquina Linux (com o Debian, faz parte do GNU libc). No entanto, uma rápida verificação disso mostra apenas o conteúdo /etc/group .

Eu (como a maioria) não tem libusers ou lid instalado, então não posso comentar se satisfaz as condições do OP.

Existe também o programa id , que fornece informações sobre o grupo. Alguém pode expandir isso como uma resposta possível.

    
por 06.11.2015 / 12:56
2

Funciona como um encanto:

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

Alguns lhe dirão para instalar o libuser (para 'lid') ou membros (para 'membros'). Mas com base na resposta link que tratou este problema com a adesão ao grupo de login eu encontrei outro grupo não sendo coberto por esse script. Então - aqui está o 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
    
por 04.09.2017 / 10:04
2
O comando

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

# lid -g <groupname>
    
por 06.11.2015 / 12:56
0

Esta 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
    
por 05.04.2017 / 19:17

Tags