Muitos sistemas têm um getent
comando à lista ou consultar o conteúdo dos Name Service bases de dados como passwd
, group
, services
, protocols
...
getent passwd | cut -d: -f6
Listaria os diretórios pessoais (o 6 ° campo delimitado por dois pontos) de todos os usuários nos bancos de dados que podem ser enumerados .
O nome do usuário está no primeiro campo, portanto, para a lista de nomes de usuário:
getent passwd | cut -d: -f1
(observe que isso não significa que esses usuários podem efetuar login no sistema ou que seu diretório pessoal foi criado, mas que eles são conhecidos pelo sistema, podem ser traduzidos para um ID do usuário).
Para bancos de dados que não podem ser enumerados, você pode tentar consultar cada ID de usuário possível individualmente:
getent passwd {0..65535} | cut -d: -f1,6
(assumindo que os uids param em 65535 (alguns sistemas suportam mais) e um shell que suporta a {x..y}
forma de expansão de chaves do zsh ). Mas você não gostaria de fazer isso frequentemente em sistemas em que o banco de dados do usuário está em rede (e há cache local limitado) como LDAP, NIS +, SQL ... pois isso pode implicar muito tráfego de rede (e carregar no servidor de diretório ) para fazer todas essas consultas.
Isso também significa que, se houver vários usuários compartilhando o mesmo uid, você receberá apenas uma entrada para cada uid; portanto, perca os outros.
Se você não possui getent
, pode recorrer a perl
:
perl -le 'while (@e = getpwent) {print $e[7]}'
para getent passwd
( $e[0]
para os nomes de usuário) ou:
perl -le 'for ($i=0;$i<65536;++$i) {
if (@e = getpwuid $i) {print $e[0] ": " $e[7]}}'
para getent passwd {0..65535}
com as mesmas ressalvas.
Nos shells, você pode usar ~user
para obter o diretório inicial de user
, mas na maioria dos shells, isso funciona apenas para um conjunto limitado de nomes de usuários (a lista de caracteres permitidos nos nomes de usuários suportados pelo ~
operador de expansão varia de shell para shell) e com vários shells (inclusive bash
), ~$user
não funcionarão (você precisará recorrer eval
quando o nome do usuário estiver armazenado em uma variável). E você ainda teria que encontrar uma maneira de obter a lista de nomes de usuário.
Alguns shells têm suporte embutido para obter essa lista de nomes de usuários.
bash
: compgen -u
retornaria a lista de usuários em bancos de dados que podem ser enumerados.
zsh
: a $userdirs
matriz associativa mapeia os nomes de usuários para o diretório inicial (também limitado aos bancos de dados que podem ser enumerados, mas se você fizer uma ~user
expansão para um usuário que esteja em um banco de dados não enumerável, uma entrada será adicionada $userdirs
). Então você pode fazer:
printf '%s => %s\n' "${(kv@)userdirs}"
para listar usuários com seu diretório inicial.
Isso só funciona quando zsh
é interativo .
tcsh
, fish
e yash
são três outros shells que podem completar nomes de usuário (por exemplo, ao concluir ~<Tab>
argumentos), mas não parece que eles permitem obter essa lista de nomes de usuário programaticamente.