echo usuários com um gid específico

0

Eu sou realmente novo em toda essa programação de shell, então eu realmente não entendo muito. Eu tenho que escrever um script de shell que irá ecoar os nomes de usuários, cujo grupo primário é igual ao grupo cujo id é o argumento da linha de comando.

    
por ivana14 28.05.2017 / 21:18

3 respostas

2

Como você está fazendo a pesquisa por GID, não pelo grupo nome , e você está interessado apenas no primário GID para cada usuário, isso é trivialmente fácil com Awk.

O formato de /etc/passwd é descrito em man 5 passwd . Para citar a página man:

   There is one entry per line, and each line has the format:

          account:password:UID:GID:GECOS:directory:shell

Então você quer imprimir o primeiro campo para cada linha onde o campo quarto é o que é passado para o seu script. Onde "campos" são delimitados por dois pontos.

Pessoalmente, eu não me incomodaria com um roteiro para isso; Eu usaria uma função shell. Veja:

Então tudo que você precisa é:

  • Um entendimento da opção -F do Awk
  • Um entendimento básico da sintaxe do Awk, que é condition {action}
  • Uma compreensão de como fazer referência a campos ao usar o Awk e
  • Isso ajudará se você tiver uma compreensão de como passar as variáveis do shell para Awk; veja a opção -v do Awk.

Verifique a página man do Awk para obter esses pontos.

Eu não farei sua lição de casa para você - o objetivo é aprender a codificar , não aprender a copiar e colar. Mas se você ficar preso nisso, por favor, comente sobre esta questão. Eu posso adicionar um pouco mais de detalhes, se necessário. (E em uma semana ou mais eu posso atualizar para incluir uma solução completa.)

Nota: no mundo real, como você pode ver nas outras respostas, há muito mais complexidade associada à pesquisa de usuários. Muitas maneiras diferentes de os usuários poderem ser armazenados, e a contabilidade dessas complexidades pode ser ... complexa.

Mas sua pergunta parece ser uma tarefa feita sob medida para ser facilmente realizada com o Awk, além de ser um aplicativo realista que seria útil no mundo real.

    
por 31.05.2017 / 05:19
1

Isso nem sempre é possível porque os bancos de dados do usuário nem sempre são enumeráveis.

No banco de dados passwd ( /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 diferentes gids).

Sempre é possível consultar o banco de dados do usuário para um determinado nome de usuário, mas nem sempre é possível recuperar a lista completa de usuários.

Você pode tentar. Não há um comando padrão para isso, mas muitos sistemas têm um comando getent que você pode usar.

getent passwd

Retorna a lista de usuários como um csv (separado por dois pontos). O primeiro campo é o nome do usuário e o quarto é o principal. Então, se você conhece o gid, pode facilmente retornar a lista de usuários usando awk .

getent -- group "$group"

Consultará o banco de dados do grupo para 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 um dos números possíveis individualmente (tenha em mente que alguns sistemas suportam uids até 2 31 ), mas mesmo assim não é garantido retornar todos os possíveis usuários, pois pode haver mais de um usuário por uid, e as consultas de banco de dados de senha geralmente retornam apenas um usuário.

    
por 28.05.2017 / 21:57
1
#!/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 para a existência de um parâmetro, o script consulta o banco de dados do usuário ( getent passwd ) usando o awk para verificar o quarto campo (ID do grupo primário) em relação ao ID do grupo principal do banco de dados do grupo. Se uma linha (entrada do usuário) corresponder, ela imprimirá o primeiro campo (nome de usuário).

    
por 31.05.2017 / 02:50