Quero criar um script para verificar se existe um usuário. Estou usando a lógica abaixo:
# getent passwd test > /dev/null 2&>1
# echo $?
0
# getent passwd test1 > /dev/null 2&>1
# echo $?
2
Portanto, se o usuário existe, temos sucesso, caso contrário, o usuário não existe. Eu coloquei o comando acima no script bash como abaixo:
#!/bin/bash
getent passwd $1 > /dev/null 2&>1
if [ $? -eq 0 ]; then
echo "yes the user exists"
else
echo "No, the user does not exist"
fi
Agora, meu script sempre diz que o usuário existe, não importa o que:
# sh passwd.sh test
yes the user exists
# sh passwd.sh test1
yes the user exists
# sh passwd.sh test2
yes the user exists
Por que a condição acima sempre avalia como VERDADEIRA e diz que o usuário existe?
Onde eu estou errando?
ATUALIZAR:
Depois de ler todas as respostas, encontrei o problema no meu script. O problema era o modo como eu estava redirecionando a getent
saída. Então eu removi todo o material de redirecionamento e fiz a getent
linha ficar assim:
getent passwd $user > /dev/null
Agora meu script está funcionando bem.
$?
você obtém o código de retorno dotest
comando. Veja a resposta abaixo.getent
e a suaif
declaração? Isso causaria$?
a verificação do status de saídaecho
e não da sua ligaçãogetent
.2>&1
vez de2&>1
.$1
não estiver definido, a instrução if retornará true. Do meu testes, solução seria para embrulhar$1
entre aspas:getent passwd "$1" > /dev/null 2&>1
.Respostas:
você também pode verificar o usuário por
id
comando.id -u name
fornece o ID desse usuário. se o usuário não existir, você terá o comando return value ($?
)1
fonte
validuser(){ [[ -n $(id -u "$1" 2>/dev/null) ]] && echo 1 || echo 0; }
. Isso retorna praticamente 1 se o usuário existir ou 0 se não existir.Por que você simplesmente não usa
Ele retornará 1 (já que um usuário possui no máximo 1 entrada) se o usuário existir e 0 se não existir.
fonte
getent passwd | grep -c '^username:'
:
após o nome de usuário protegem contra a correspondência de substring combinando com o separador de campos, para que o efeito que você descreve não aconteça.Não há necessidade de verificar o código de saída explicitamente. Experimentar
Se isso não funcionar, há algo errado com o seu
getent
, ou você tem mais usuários definidos do que pensa.fonte
Isto é o que acabei fazendo em um
Freeswitch
script de inicialização do bash:fonte
Sugiro usar o comando id, pois ele testa a entrada válida do arquivo wrt passwd da existência do usuário, o que não é necessário, significa o mesmo:
Nota: 0 é o usuário root.
fonte
Eu estava usando dessa maneira:
fonte
De longe a solução mais simples:
O
>/dev/null 2>&1
pode ser reduzido para&>/dev/null
no Bash.fonte
Script para verificar se o usuário Linux existe ou não
Script Para verificar se o usuário existe ou não
fonte
cat
?grep $USER_NAME /etc/passwd >/dev/null 2>&1
Resposta tardia, mas
finger
também mostra mais informações sobre o usuáriofonte
Na verdade, não posso reproduzir o problema. O script, conforme escrito na pergunta, funciona bem, exceto no caso em que $ 1 está vazio.
No entanto, há um problema no script relacionado ao redirecionamento de
stderr
. Embora as duas formas&>
e>&
existem, em seu caso, você quer usar>&
. Você já redirecionoustdout
, é por isso que o formulário&>
não funciona. Você pode facilmente verificar desta maneira:Você verá um arquivo nomeado
1
no diretório atual. Você deseja usar2>&1
, ou use o seguinte:Isso também redireciona
stdout
estderr
para/dev/null
.Aviso Redirecionar
stderr
para/dev/null
pode não ser uma boa idéia. Quando as coisas dão errado, você não tem idéia do porquê.fonte
as informações do usuário são armazenadas em / etc / passwd, para que você possa usar "grep 'nome de usuário' / etc / passwd" para verificar se o nome de usuário existe. Enquanto isso, você pode usar o comando shell "id", ele imprimirá a identificação do usuário e a identificação do grupo; se o usuário não existir, imprimirá a mensagem "sem esse usuário".
fonte
Faça login no servidor. grep "nome de usuário" / etc / passwd Isso exibirá os detalhes do usuário, se presentes.
fonte
if grep -q "^username:" /etc/passwd; then ...
Usando sed:
fonte
Dependendo da implementação do seu shell (por exemplo, Busybox x adulto), o
[
operador pode iniciar um processo, mudando$?
.Experimentar
fonte
$?
me dá a mesma saída. Esta é a versão do bash:GNU bash, version 4.1.5(1)-release (i486-pc-linux-gnu)
if test "$RES" == "0"; then ...
$?
seria expandido antes das[
execuções, então isso não é um problema.if getent passwd $1 > /dev/null 2&>1; then echo "yes the user exists" else echo "No, the user does not exist" fi
Abaixo está o script para verificar a distribuição do SO e criar Usuário, se não existir, e não fazer nada, se o usuário existir.
fonte
Crie usuário do sistema
some_user
se ele não existirfonte
Eu gosto dessa ótima solução de uma linha
e no script:
usar:
fonte