Devo escrever um script de shell que ecoará nomes de usuários cujo grupo primário é igual ao grupo cujo id é o argumento da linha de comando.
Responder1
Como você está pesquisando por GID e não por gruponome, e você está interessado apenas noprimárioGID para cada usuário, isso é trivialmente fácil com o Awk.
O formato de /etc/passwd
é descrito em man 5 passwd
. Para citar a página de manual:
There is one entry per line, and each line has the format:
account:password:UID:GID:GECOS:directory:shell
Então você deseja imprimir o primeiro campo para cada linha onde oquartocampo é o que é passado para o seu script. Onde os "campos" são delimitados por dois pontos.
Pessoalmente, eu não me incomodaria em criar um script para isso; Eu usaria uma função shell. Ver:
Então tudo que você precisa é:
- Uma compreensão da
-F
opção para Awk - Uma compreensão básica da sintaxe do Awk, que é
condition {action}
- Uma compreensão de como referenciar campos ao usar o Awk, e
- Ajudará se você entender como passar variáveis de shell para o Awk; procure a
-v
opção do Awk.
Verifique a página de manual do Awk para obter esses pontos.
Não farei sua lição de casa para você - o objetivo é aprender acódigo, não aprenda a copiar e colar. Mas se você ficar preso nisso, comente esta questão. Posso adicionar um pouco mais de detalhes, se necessário. (E em cerca de uma semana posso atualizar para incluir uma solução completa.)
Observação lateral: no mundo real, como você pode ver nas outras respostas, há muito mais complexidade associada à procura de usuários. Muitas maneiras diferentes de armazenar os usuários, e contabilizar essas complexidades pode ser...complexo.
Mas sua pergunta parece ser uma tarefa feita sob medida para ser facilmente realizada com o Awk, ao mesmo tempo que é um aplicativo realista que seria útil no mundo real.
Responder2
Isso nem sempre é possível porque os bancos de dados de usuários nem sempre são enumeráveis.
No passwd
banco de dados ( /etc/passwd
, LDAP, mysql, NIS+, etc. ou uma combinação), a chave primária é o nome do usuário. (vários usuários podem ter o mesmo UID, possivelmente com GIDs diferentes).
Você sempre pode consultar o banco de dados de usuários em busca de um determinado nome de usuário, mas nem sempre é possível recuperar a lista completa de usuários.
Podes tentar. Não existe um comando padrão para isso, mas muitos sistemas possuem um getent
comando que você pode usar.
getent passwd
Retornará a lista de usuários como um csv (separado por dois pontos). O primeiro campo é o nome do usuário e o quarto o gid primário. Portanto, se você conhece o gid, pode retornar facilmente a lista de usuários usando awk
.
getent -- group "$group"
Consultará o banco de dados do grupo para obter o dado $group
e retornará uma linha de csv onde o terceiro campo é o gid. cut
seria suficiente para extraí-lo.
Se o banco de dados do usuário não for enumerável, você pode tentar consultar cada número de uid possível individualmente (cuidado, alguns sistemas suportam uids até 2 31 ), mas mesmo assim não há garantia de retornar todos os usuários possíveis, pois pode haver mais de um usuário por uid, e as consultas ao banco de dados de senha geralmente retornam apenas um usuário.
Responder3
#!/bin/sh
if [ $# -ne 1 ]
then
echo "Usage: $0 gid"
exit 1
fi
getent passwd | awk -F: -v pgid=$gid '$4 == pgid { print $1 }'
Após a verificação de erros quanto à existência de um parâmetro, o script consulta o banco de dados do usuário ( getent passwd
) usando awk para verificar o quarto campo (ID do grupo primário) em relação ao ID do grupo primário do banco de dados do grupo. Se uma linha (entrada do usuário) corresponder, ela imprimirá o primeiro campo (nome de usuário).