web-dev-qa-db-pt.com

Descubra se existe um nome de usuário

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.

65
Daniel Beck

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
98
barbaz

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.

19
jlliagre

fingername__

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.

chownname__

Execute (como qualquer usuário, surpreendentemente):

T=$( mktemp -t foo.XXX ) ; chown <username> $T

Se falhar como rootname__, o nome da conta é inválido.

Se falhar como non -rootuser, analise a saída possivelmente localizada para Operação não permitida ou suário inválido (ou equivalentes). Defina LANGantecipadamente para fazer isso de forma confiável.

6
Daniel Beck

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.

0
TOOGAM