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.
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'
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.
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.
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)
groupmems -g groupname -l
lista todos os usuários no grupo nomeado.
Estou surpreso que ninguém tenha mencionado
id <user>
Este comando dará uma lista de grupos em que o usuário está.
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.
Funciona como um encanto:
cut -d: -f1,4 /etc/passwd | grep $(getent group <groupname> | cut -d: -f3) | cut -d: -f1
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
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>
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