Muitos sistemas têm um comando getent
para listar ou consultar o conteúdo dos bancos de dados Name Service como passwd
, group
, services
, protocols
...
getent passwd | cut -d: -f6
Relacionaria os diretórios pessoais (o campo delimitado por dois pontos) de todos os usuários nos bancos de dados que podem ser enumerados .
O próprio nome do usuário está no primeiro campo, portanto, para a lista de nomes de usuários:
getent passwd | cut -d: -f1
(note que isso não significa que os usuários podem efetuar login no sistema ou que seu diretório pessoal tenha sido criado, mas que eles são conhecidos pelo sistema, eles podem ser traduzidos para um ID de usuário).
Para bancos de dados que não podem ser enumerados, você pode tentar consultar cada ID de usuário individualmente:
getent passwd {0..65535} | cut -d: -f1,6
(aqui assumindo que os uids param em 65535 (alguns sistemas suportam mais) e um shell que suporta a forma% c_de% do zsh da expansão de chaves). Mas você não gostaria de fazer isso frequentemente em sistemas onde o banco de dados do usuário está em rede (e há um cache local limitado) como LDAP, NIS +, SQL ... já que isso poderia implicar muito tráfego de rede (e carregar no servidor de diretório ) para fazer todas essas perguntas.
Isso também significa que, se houver vários usuários compartilhando o mesmo uid, você receberá apenas uma entrada para cada uid, então perca os outros.
Se você não tiver {x..y}
, poderá recorrer a getent
:
perl -le 'while (@e = getpwent) {print $e[7]}'
para perl
( getent passwd
para os nomes de usuários) ou:
perl -le 'for ($i=0;$i<65536;++$i) {
if (@e = getpwuid $i) {print $e[0] ": " $e[7]}}'
para $e[0]
com as mesmas advertências.
Em shells, você pode usar getent passwd {0..65535}
para obter o diretório home de ~user
, mas na maioria dos shells, isso só funciona para um conjunto limitado de nomes de usuários (a lista de caracteres permitidos em nomes de usuários suportados para esse% o operador de expansãouser
varia de shell para shell) e com vários shells (incluindo ~
), bash
não funcionará (você precisaria recorrer a ~$user
quando o nome do usuário é armazenado em uma variável lá). E você ainda teria que encontrar uma maneira de obter a lista de nomes de usuários.
Alguns shells têm suporte embutido para obter essa lista de nomes de usuários.
-
eval
:bash
retornaria a lista de usuários nos bancos de dados que podem ser enumerados. -
compgen -u
: o array associativozsh
mapeia os nomes de usuário para seu diretório pessoal (também limitado a bancos de dados que podem ser enumerados, mas se você fizer uma expansão$userdirs
para um usuário que não esteja em um banco de dados enumerável) , uma entrada será adicionada ao~user
). Então você pode fazer:printf '%s => %s\n' "${(kv@)userdirs}"
para listar usuários com seu diretório inicial.
Isso só funciona quando o
$userdirs
é interativo . -
zsh
,tcsh
efish
são três outros shells que podem completar nomes de usuários (por exemplo, ao completaryash
arguments), mas não parece que eles permitem que você obtenha essa lista de nomes de usuários de forma programática.