Como posso descobrir, em um script de shell, se um determinado nome de usuário existe no sistema atual?
/etc/passwde /etc/shadowestã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/passwde /etc/shadowestã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
ifcom 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á getentno Mac OS X
fingerAnalise 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 0se o usuário for encontrado (porque não há saída de erro), números maiores caso contrário.
chownExecute (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 rootusuário, analise a saída possivelmente localizada para Operação não permitida ou usuário inválido (ou equivalente). Defina com LANGantecedência para fazer isso de forma confiável.
Eu diria que você gostaria de confiar em algo /etc/passwdsemelhante (por exemplo, /etc/shadowpara sistemas baseados em Shadow; em uma observação secundária, alguns sistemas similares podem usar /etc/master.passwdou 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/passwdnã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.
idou getentnã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...