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 Linux com a integração do mesmo diretório ativo.
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 Linux com a integração do mesmo diretório ativo.
Respostas:
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
O que produz
$ ./userexists root
user exists
$ ./userexists alice
user does not exist
$ ./userexists
user does not exist
if
com verificador de resultados negativos?
id -u $1 1>/dev/null 2>&1; echo $?
pode ser usado para tubo
getent
Este comando foi projetado para reunir entradas para os bancos de dados que podem ser apoiados por arquivos / etc e vários serviços remotos como LDAP, AD, NIS / Páginas Amarelas, DNS e afins.
Para descobrir se um nome de usuário é conhecido por um dos serviços de nomeação de senha, basta executar:
getent passwd username
Isso funciona também com grupos, hosts e outros, dependendo do sistema operacional e da implementação.
getent
, não há getent
no Mac OS X
finger
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 do erro será gravada. Sem inconvenientes 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
Execute (como qualquer usuário, surpreendentemente):
T=$( mktemp -t foo.XXX ) ; chown <username> $T
Se falhar root
, o nome da conta é inválido.
Se falhar como não root
usuário, analise a saída possivelmente localizada para Operação não permitida ou usuário inválido (ou equivalente). Defina com LANG
antecedência para fazer isso de forma confiável.
Eu diria que você gostaria de confiar em algo /etc/passwd
semelhante (por exemplo, /etc/shadow
para sistemas baseados em Shadow; em uma observação secundária, alguns sistemas similares podem usar /etc/master.passwd
ou outros arquivos desse tipo).
A /etc/passwd
é tipicamente tratada como a decisão de autoridade absoluto sobre se um utilizador 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 existirem, 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 isto, jogarei de outra maneira para adicionar à mistura de algumas outras opções que poderiam ser usadas.
ls -l /home | grep ^customUserName$<BR>
echo $?
Substitua claramente "customuserName" pelo nome do usuário que você deseja verificar. Substitua / home por / users se é isso que o seu sistema usa. Isso pode não encontrar todos os usuários em / etc / passwd se nenhum diretório inicial foi criado para o usuário específico, o que poderia ocorrer se você simplesmente importasse usuários (ou seja, linhas de texto em / etc / passwd) e se os diretórios pessoais não feito a menos que / até que uma pessoa faça login.
id
ou getent
não "adequadamente" no sistema, especialmente quando o OP está declarando claramente que os serviços de nomes são Para ser considerado.
if id -u "$1" >/dev/null 2>&1; then
...