Nos sistemas Linux, há o programa getent
, que utiliza as funções get*ent(2)
padrão ( getpwent()
sendo o único a ser usado aqui). O que você deseja recuperar é o conteúdo do banco de dados passwd
(tente man nsswitch.conf
para entender melhor):
$ getent passwd
root:x:0:0:root:/root:/bin/bash
sashroot:x:0:0:root:/root:/bin/sash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh
sys:x:3:3:sys:/dev:/bin/sh
sync:x:65004:65534:sync:/bin:/bin/sync
games:x:65005:65060:games:/usr/games:/bin/sh
man:x:65006:65012:man:/var/cache/man:/bin/sh
lp:x:65007:7:lp:/var/spool/lpd:/bin/sh
mail:x:65008:65008:mail:/var/mail:/bin/sh
...
Fica muito mais interessante depois que as contas padrão do sistema são roladas.
Se você não é um sistema Linux, pode facilitar isso escrevendo algo que elimina o banco de dados do usuário sozinho usando a função getpwent(2)
. Um exemplo em C seria algo assim:
#include <sys/types.h>
#include <pwd.h>
#include <stdio.h>
int
main(void)
{
struct passwd *pwd;
while ((pwd = getpwent()) != NULL) {
printf("user = '%s', uid = %d, gid = %d, name = '%s'\n",
pwd->pw_name, pwd->pw_uid, pwd->pw_gid, pwd->pw_gecos);
}
return 0;
}
Coloque isso em um arquivo test.c
e construa-o com
$ gcc -o test test.c
Depois, você pode ligar para ./test
e ver o que você recebe:
$ ./test
user = 'root', uid = 0, gid = 0, name = 'root'
user = 'sashroot', uid = 0, gid = 0, name = 'root'
user = 'daemon', uid = 1, gid = 1, name = 'daemon'
user = 'bin', uid = 2, gid = 2, name = 'bin'
user = 'sys', uid = 3, gid = 3, name = 'sys'
user = 'sync', uid = 65004, gid = 65534, name = 'sync'
user = 'games', uid = 65005, gid = 65060, name = 'games'
user = 'man', uid = 65006, gid = 65012, name = 'man'
user = 'lp', uid = 65007, gid = 7, name = 'lp'
user = 'mail', uid = 65008, gid = 65008, name = 'mail'
...
Como acima, ficará mais interessante mais tarde.
A abordagem de usar getwent()
tem a grande vantagem de você não precisar fazer suposições sobre como o sistema de login está configurado ( /etc/passwd
, LDAP, NIS,…?), mas permite que o sistema recupere o sistema. informações com sua configuração atual.
Editar: pode acontecer que o back-end de armazenamento da base de dados passwd
, p. LDAP, não permite enumerar o banco de dados (e, portanto, getpwent()
), mas apenas entregar conjuntos de dados solicitados explicitamente pela chave (por exemplo, nome de login ou UID, portanto getpwuid()
ou getpwnam()
pode funcionar). Neste caso (e desde que seus nomes de usuários de destino são tão bem nomeados) você ainda pode "enumerar" manualmente com uma modificação do script @ masegaloeh:
#!/bin/bash
for i in {000000..999999}; do
getent passwd "e${i}" 2> /dev/null
done
Como fazer isso na ausência de getent
com a API do sistema ( getpwnam()
, getpwuid()
) é deixado como um exercício para o leitor.