shell script - Verificar se usuario existe dentro do /etc/passwd

1. shell script - Verificar se usuario existe dentro do /etc/passwd

alan
slinkp

(usa Ubuntu)

Enviado em 02/04/2022 - 00:29h

Boa noite galera,

Podem ajudar referente esse shell script?
Quero verificar se o usuario que eu digitar já existe dentro do /etc/passwd

#!/bin/bash

existente=$(cut -d: -f1 /root/alan.txt)
echo 'informe o nome de usuario a ser criado'
read usuario
if [ $usuario = $existente ]; then

echo "usuario ja exite"
else
echo "usuario nao existe"
fi

Aparece essa mensagem de erro:
./usuariosexistentes.sh: linha 6: [: número excessivo de argumentos


  


2. Re: shell script - Verificar se usuario existe dentro do /etc/passwd

Paulo
paulo1205

(usa Ubuntu)

Enviado em 02/04/2022 - 06:44h

Na linha 6, coloque as expansões de variáveis entre aspas (por exemplo, em lugar de «$existente», use «"$existente"»).

Isso vai livrar você da mensagem de erro exibida, mas provavelmente não vai ser o suficiente para fazer a verificação de maneira correta. Se o arquivo que você está verificando tiver mais de uma linha, aquela invocação do comando cut certamente vai produzir mais de um nome dentro da variável existente (sendo essa, possivelmente, a causa do problema que você reportou).

Para fazer o que você deseja (ver se um usuário existe no /etc/passwd), o mais natural seria usar o comando grep. Entretanto, se a proposta do exercício for fazer a tarefa usando exclusivamente os comandos internos do shell em lugar de ferramentas externas, então também o cut deveria ser evitado, e a forma de fazer seria ler o nome do usuário desejado primeiro, e depois varrer cada linha do arquivo e comparar seu conteúdo com o nome do usuário desejado, até encontrá-lo ou até chegar ao final do arquivo.

Se for o caso de fazer usando exclusivamente o shell, então o que você precisa estudar são os comandos internos read, while, if e talvez break, além de operações de comparação envolvendo strings e de redirecionamentos persistentes por meio do comando interno exec.


... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)


3. Re: shell script - Verificar se usuario existe dentro do /etc/passwd

alan
slinkp

(usa Ubuntu)

Enviado em 04/04/2022 - 20:07h


Boa noite Paulo

Como faço para usar esse comando interno exec



4. Re:

Rafael Grether
rafael_grether

(usa FreeBSD)

Enviado em 05/04/2022 - 15:25h


Olá,

Na variavel existente voce armazenou uma lista de valores. Voce não pode comparar essa lista com um único usuario. Nesse caso você precisa fazer o loop e comparar linha a linha.
OU pode fazer via GREP (proximo comentario).

#!/bin/sh

read -p "Informe o usuario: " usuario_informado

usuario_existe=0

for usuarios_existentes in $(cut -d: -f1 /etc/passwd)
do
if [ "$usuario_informado" = "$usuarios_existentes" ]; then
usuario_existe=1
break;
fi
done

test "$usuario_existe" = "1" && echo "Usuario existe" || echo "Usuario não existe"


5. Re:

Rafael Grether
rafael_grether

(usa FreeBSD)

Enviado em 05/04/2022 - 15:26h


Complementando acima, via grep, muito mais simples, voce pode simplesmente fazer:

#!/bin/sh

read -p "Informe o usuario: " usuario
cut -d: -f1 /etc/passwd | grep "$usuario" &> /dev/null

test "$?" -eq "0" && echo "Usuario Existe" || echo "Usuario Nao Existe"


6. Re: shell script - Verificar se usuario existe dentro do /etc/passwd

Marcelo Oliver
msoliver

(usa Debian)

Enviado em 05/04/2022 - 19:25h

slinkp escreveu:

Boa noite galera,

Podem ajudar referente esse shell script?
Quero verificar se o usuario que eu digitar já existe dentro do /etc/passwd

#!/bin/bash

existente=$(cut -d: -f1 /root/alan.txt)
echo 'informe o nome de usuario a ser criado'
read usuario
if [ $usuario = $existente ]; then

echo "usuario ja exite"
else
echo "usuario nao existe"
fi

Aparece essa mensagem de erro:
./usuariosexistentes.sh: linha 6: [: número excessivo de argumentos


Boa tarde, seguem sugestões:
"Pegue" somente usuários que não são do sistema.
UID_MIN e UID_MAX em /etc/login.defs
#Cria as variáveis: UID_MIN e UID_MAX
eval $(awk '$1~/^UID/{printf "%s=%s\n",$1,$2}' /etc/login.defs)
#Cria var com usuários existentes
existe=$(awk -F":" '$3>='$UID_MIN' && $3<='$UID_MAX' {printf "%s\n",$1}' /etc/passwd|paste -sd'|')
read -p "Informe o usuário: " usuario
#Testa
[[ "$usuario" =~ ("${existe}") ]] && echo Existe || echo "Não existe"

Ou
grep -q "^${usuario}:"  /etc/passwd && echo "$usuario já Cadastrado" || echo "$usuario Não Cadastrado" 

# Só com Bash
stt=0;
while IFS=":" read -a cps;do
if ((${cps[2]}>=$UID_MIN && ${cps[2]}<=$UID_MAX));then
[[ "$usuario" =~ "${cps[0]}" ]] && { let stt++;break;}
fi
done < /etc/passwd
(($stt > 0)) && echo "$usuario já Cadastrado" || echo "$usuario Não Cadastrado"




______________________________________________________________________
Importante:
lynx --dump https://www.vivaolinux.com.br/termos-de-uso/ | sed -nr '/^[ ]+Se/,/dou.$/p'
______________________________________________________________________
Nota de esclarecimento:
O comando: ACIMA, faz parte da minha assinatura.
Att.: Marcelo Oliver
______________________________________________________________________



7. Re: shell script - Verificar se usuario existe dentro do /etc/passwd

Paulo
paulo1205

(usa Ubuntu)

Enviado em 06/04/2022 - 00:29h

slinkp escreveu:

Boa noite Paulo

Como faço para usar esse comando interno exec


Boa noite, prezado.

Eu geralmente acredito que ensinar a pescar é melhor do que dar o peixe. Você tentou ler pelo menos a documentação do Bash?

Eis como eu normalmente faço — e recomendo que se faça — a leitura de múltiplas linhas de um mesmo arquivo em um script do shell.
#!/bin/bash

# ...

usuario_encontrado=0
exec 3< /etc/passwd # “3” aqui é um número de descritor que não esteja em uso (0, 1 e 2 normalmente vêm prealocados, ligados ao terminal ou algum redirecionamento feito antes de invocar o script).
while read -u 3 linha; do # os argumentos “-u 3” mandam o read ser feito no descritor 3, que nós associamos acima a um arquivo.
if [[ "$usuario_desejado" = "${linha%%:*}" ]]; then # A sintaxe “${linha%%:*}” faz com a variável seja expandida com supressão de sufixo, que é considerado como sendo a primeira ocorrência de “:” seguido de uma quantidade qualquer de outros caracteres. Não preciso de cut nem de grep.
usuario_encontrado=1
break # Já encontrei o que estava procurando, então posso interromper o laço de repetição antecipadamente.
fi
done
exec 3<&- # Após terminar de ler, desaloca novamente o descritor 3, fechando o arquivo.

(( usuario_encontrado )) && echo "Encontrou o usuário." || echo "Usuário não encontrado." >&2


Eu considero essa construção melhor do que
while read linha; do
comandos
done < /etc/passwd
porque esse tipo de redirecionamento afeta não apenas o comando read, mas tudo o que está dentro do corpo do laço de repetição, incluindo eventuais comandos externos que você invocar ali dentro — um erro relativamente comum é ter ali dentro um comando que pede confirmação ao ser executado, e a confirmação acabar consumindo do redirecionamento, em lugar de vir do terminal.

E é ainda melhor do que algo como
cat /etc/passwd | while read linha; do
comandos
done
porque este último, além de ter o mesmo problema de o redirecionamento afetar tudo o que vai dentro do laço de repetição, como no exemplo anterior, está numa pipeline, o que faz com que o laço de repetição e tudo o que está dentro dele sejam executados num processo separado, de modo que se você alterar o valor de uma variável (como eu fiz quando mexi em usuario_encontrado, no exemplo que eu recomendo), essa alteração não será visível depois que o laço de repetição acabar, já que a alteração foi feita num processo distinto.


... Então Jesus afirmou de novo: “(...) eu vim para que tenham vida, e a tenham plenamente.” (João 10:7-10)






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts