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 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 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/group
e 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/group
conteúdo.
Eu (como a maioria) não tenho libusers
ou lid
instalei, portanto não posso comentar se satisfaz as condições do OP.
Há também o id
programa, que fornece informações de grupo. Alguém pode expandir isso como uma possível resposta.
groups
comando. É improvável que você não o tenha no Linux, pois faz parte do coreutils.