Descubra se o nome do usuário existe

68

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.

Daniel Beck
fonte

Respostas:

103

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
barbaz
fonte
2
Você não precisa das aspas aqui - apenas use if id -u "$1" >/dev/null 2>&1; then...
Gordon Davisson
11
@Gordon absolutamente certo, é claro. Obrigado :)
barbaz
"u" também parece desnecessário
palacsint
E se eu precisasse apenas ifcom verificador de resultados negativos?
Yura Shinkarev
id -u $1 1>/dev/null 2>&1; echo $?pode ser usado para tubo
JasonWayne
20

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.

jlliagre
fonte
11
Enquanto Solaris e Linux, e mais recentemente também a maioria dos BSDs têm getent, não há getentno Mac OS X
barbaz
Na verdade, eu senti falta do Mac OS / X getent.
Jlliagre
No entanto, é bastante útil nos sistemas que suporta.
Daniel Beck
11
getent é legal porque você pode consultar vários nomes de usuário em que o id suporta apenas um único nome de usuário.
nall
6

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 0se 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 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.

Daniel Beck
fonte
0

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.

TOOGAM
fonte
Não entendo por que você declara um usuário que não possui entrada no arquivo / etc / password, mas que é relatado como válido por existir idou getentnão "adequadamente" no sistema, especialmente quando o OP está declarando claramente que os serviços de nomes são Para ser considerado.
Jlliagre