Comando amigável para listar todos os usuários no sistema Ubuntu?

22

Existe um comando amigável que eu possa usar para listar usuários em um console em um sistema Ubuntu?

Quando eu cat /etc/passwd , obtenho uma lista de usuários difícil de ler. Seria bom ver uma lista em ordem alfabética, com entradas organizadas em colunas e com nomes de grupos em parênteses ao lado dos IDs de grupo.

    
por M. Dudley 03.02.2013 / 03:06

5 respostas

27

Boa maneira de uma boa saída do arquivo / etc / passwd:

$ column -nts: /etc/passwd

Agora você pode classificá-lo:

$ column -nts: /etc/passwd | sort

Com nomes de grupos na última coluna (sem parênteses):

$ paste -d: /etc/passwd <(groups $(cut -d: -f1 /etc/passwd) | sed 's/.*: //') | column -nts: | sort
    
por 03.02.2013 / 03:42
9

Se você tiver acesso root na máquina, poderá fazer o seguinte:

sudo grep -vE '^[^*!]+:[*!]:' /etc/shadow | sort | cut -d: -f1 | while read user; do id $user; done | column -ts' ,' | vi '+set nowrap' -

Como funciona

Torne-se root para ler o arquivo shadow. Você só precisa de privilégios de root se quiser verificar se o usuário tem uma senha configurada (usuário humano), caso contrário, você poderá apenas cat /etc/passwd em vez de sudo grep ... :

sudo 

Mostrar apenas usuários que tenham uma senha definida:

grep -vE '^[^*!]+:[*!]:' /etc/shadow

Classificar por nome de usuário:

sort 

Descarte todas as informações, exceto o nome de usuário:

cut -d: -f1

Itere pelos nomes de usuário e enriqueça com informações do grupo:

while read user; do id $user; done

Formate a entrada em colunas:

column -ts' ,'

Use vi para ver o resultado:

vi '+set nowrap' - 

Se você não tem acesso root,

tente algo assim:

cut -d: -f1 /etc/passwd | sort | while read user; do id $user; done | sed 's/\(\()\|^\)[^(]*(\|)\)/ /g' | column -t

Sua saída é um pouco diferente, mas deixo como um exercício para o leitor combinar as duas partes desta resposta em algo que se encaixa perfeitamente no trabalho. (Você não ama apenas sed ?)

    
por 03.02.2013 / 13:21
1

No Ubuntu, pode ser o seguinte:

sete campos de / etc / passwd armazenados em $ f1, f2 ..., $ f7

while IFS=: read -r f1 f2 f3 f4 f5 f6 f7
do
 echo "User $f1 use $f7 shell and stores files in $f6 directory."
done < /etc/passwd
    
por 09.09.2013 / 04:21
1

Algo que faço e funciona para os meus propósitos é

ls /home

Com certeza, isso não dá a você uma lista de usuários, e sim uma lista de diretórios pessoais e diretórios de usuários, mas qualquer comando que você queira fazer em um usuário que não existe no terminal dirá a você e pode ser um sugestão para remover o arquivo inicial que não tem um usuário ou movê-lo!

    
por 01.05.2015 / 01:38
0

Achei que isso seria fácil com join , mas join exige que os arquivos sejam classificados no campo de associação . Por isso, é necessário (?) Uma solução alternativa com arquivos temporários. A saída é classificada no usuário e exibe o ID do usuário, grupo e grupo.

uag () {
  TEMP_GROUPS=/var/tmp/sorted_groups
  TEMP_USERS=/var/tmp/sorted_users
  cat /etc/group  | tr ":" " " | sort -k 3 -o $TEMP_GROUPS
  cat /etc/passwd | tr ":" " " | sort -k 4 -o $TEMP_USERS
  join -1 4 -2 3 -o 1.1,2.1,2.3 $TEMP_USERS $TEMP_GROUPS | sort
  rm $TEMP_GROUPS $TEMP_USERS
}

Traduza um caractere para outro com tr ; sort de acordo com um campo-chave com -k , saída para arquivo com -o ; junte-se em relação aos campos no primeiro ( -1 ) e no segundo ( -2 ) arquivo, saída determinados campos no primeiro arquivo ( -o 1.1 ), bem como o segundo ( ,2.1,2.3 ).

    
por 03.02.2013 / 23:24