Como posso descobrir, em um script de shell, se um determinado nome de usuário existe no sistema atual?
/etc/passwd
e /etc/shadow
estão incompletos. Considere os serviços de diretório do OS X ou o Linux com integração do Active Directory da mesma forma.
Uma das ferramentas mais básicas a serem usadas para isso é provavelmente id
.
#!/bin/bash
if id "$1" >/dev/null 2>&1; then
echo "user exists"
else
echo "user does not exist"
fi
Que produz
$ ./userexists root
user exists
$ ./userexists alice
user does not exist
$ ./userexists
user does not exist
getent
Esse comando é projetado para reunir entradas para os bancos de dados que podem ser suportados por arquivos/etc e vários serviços remotos, como LDAP, AD, NIS/Páginas Amarelas, DNS e semelhantes.
Para descobrir se um nome de usuário é conhecido por um dos serviços de nomenclatura de senha, basta executar:
getent passwd username
Isso funciona também com grupos, hosts e outros, dependendo do sistema operacional e da implementação.
finger
name__Analise a saída de finger -m <username>
. Nenhum código de erro se nenhum usuário foi encontrado, infelizmente, mas se não for encontrado, a saída de erro será gravada. Sem desvantagens até agora.
finger -ms <username> 2>&1 1>/dev/null | wc -l
Irá imprimir 0
se o usuário for encontrado (porque não há saída de erro), números maiores caso contrário.
chown
name__Execute (como qualquer usuário, surpreendentemente):
T=$( mktemp -t foo.XXX ) ; chown <username> $T
Se falhar como root
name__, o nome da conta é inválido.
Se falhar como non -root
user, analise a saída possivelmente localizada para Operação não permitida ou suário inválido (ou equivalentes). Defina LANG
antecipadamente para fazer isso de forma confiável.
Eu diria que você gostaria de confiar em /etc/passwd
e similares (por exemplo, /etc/shadow
para sistemas baseados em Shadow; em uma nota lateral off-topic, alguns sistemas similares podem usar /etc/master.passwd
ou outros arquivos semelhantes).
O /etc/passwd
é normalmente tratado como a decisão autoritária absoluta sobre se um usuário existe ou não. Se você usar qualquer um dos outros métodos descritos nesta página, e se esses outros métodos apontarem para um usuário existente, mas /etc/passwd
não, então eu diria que o usuário não existe corretamente no sistema, por definição do padrão mais comum que o software provavelmente confiaria.
Dito isso, vou acrescentar outra maneira de adicionar algumas outras opções que poderiam ser usadas.
ls -l /home | grep ^customUserName$<BR> echo $?
Claramente, substitua "customuserName" pelo nome do usuário que você deseja verificar. Substitua/home por/users se é isso que seu sistema usa. Isso pode não localizar todos os usuários em/etc/passwd se nenhum diretório inicial foi criado para o usuário em particular, o que poderia ocorrer se você simplesmente importasse usuários (isto é, linhas de texto em/etc/passwd) e se diretórios home não faça-se a menos que/até que uma pessoa faça login.