script em bash para criar usuários apartir de um txt

Iniciado por yusukibr, 27 de Setembro de 2013, 16:26

tópico anterior - próximo tópico

yusukibr

Boa tarde galera, alguém pode me ajudar nesta tarefa, pois to meio enrolado em agrupar todas essas necessidades em um script

Desenvolver um script que leia um arquivo, onde seus campos estão separados por ponto e vírgula. E a partir deste arquivo criar os usuários no sistema Linux.

Deverá ser criado um diretório de entrada associado ao usuário e o interpretador de comando de cada usuário dever ser o bash. (ex: trabalho.sh)

A senha para o usuário deve ser gerada automaticamente, baseado em dados aleatórios.
Somente 8 dígitos.

Linha que eu fiz para gerar senha automática, mais acho que tem algo mais

•   senha=$RANDOM|md5sum; head –c8 echo (cria senha com 8 digitos e armazena na variável senha)
•   mkpasswd$senha (pega a variável senha e transforma para o código que é interpretado pelo sistema do Linux)



O usuário deverá ter que trocar a senha após entrar no sistema, o comando abaixo permite aplicar essa política.

chage -d 0 <nome do usuário> (para que a senha seja trocada no primeiro login)

Estrutura do arquivo:
---------------------------
NOME;EMAIL;
joão;joão@yahoo.com.br

Após a criação do usuário deve ser criado um arquivo com o "nome do usuário.txt". Neste arquivo deve conter as informações nome do usuário, email e senha que foi criada aleatoriamente.

As permissões dos arquivos criados na descrição acima devem possibilitar somente acesso para o usuário root.

Caso o script tente adicionar usuários que já existem no sistema deve ser criado uma lista com os nomes destes usuários. O Script não deve parar por conta dessa situação.

O arquivo contendo a lista de usuários que serão criados no sistema, deve ser passado como um parâmetro para o Script.

Exemplo: # incluirusuarios.sh listausuarios.txt


A lista com os usuários a serem incluídos eu já gerei (listausuarios.txt) nos parâmetros que o problema pede.

Felix

Ok... e o que você fez até agora deste script? Compartilhe o código que podemos ir auxiliando...

yusukibr

Citação de: Felix online 27 de Setembro de 2013, 17:14
Ok... e o que você fez até agora deste script? Compartilhe o código que podemos ir auxiliando...

Não tenho o script completo, eu tenho alguns comandos para criar o usuário, mais como o problema não pede que se criei a partir da digitação de usuário e e-mail então esse código não serve muito, pois ele quer que seja criado a partir de um arquivo txt que já contenha os nomes e e-mails como no exemplo, o que tenho aqui pede para que o usuário insira o nome e depois o e-mail, essas linhas de gerar senha acima também tenho que coloca-las no código só não sei como vou criar uma linha apontando par ao arquivo .txt para criar os usuários e por tudo isso em um só script, sei que se eu ficar pesquisando vou encontrar, mais to sem tempo por causa do meu tcc e mais outros 4 trabalhos que tenho de aprontar, então queria saber se alguém com experiência poderia me ajudar a terminar com esses parâmetros que já tenho:

declare TEMPLATE='/etc/skel'
declare DEFINE_SENHA='/usr/bin/passwd'

read -p "Digite o nome do usuário:" USUARIO
read -p "Digite o e-mail do usuário:" EMAIL

useradd --create-home --shell "$SHELL" --user-group --skel "$TEMPLATE" --comment "$EMAIL" "$USUARIO"

$DEFINE_SENHA $USUARIO

irtigor

Se você realmente entender o problema, vai conseguir mostrar algo que faz sentido em pouquíssimo tempo, e ai podemos ajudar nos detalhes que realmente demandariam um conhecimento (estudo) da linguagem.

yusukibr

Citação de: irtigor online 28 de Setembro de 2013, 09:38
Se você realmente entender o problema, vai conseguir mostrar algo que faz sentido em pouquíssimo tempo, e ai podemos ajudar nos detalhes que realmente demandariam um conhecimento (estudo) da linguagem.

Vlw  amigo obrigado pelos esclarecimentos, agora já da pra eu terminar o script, esse fórum é 10.

selvaking

#5
Rascunho inicial da sua idéia.
O arquivo ~/bin/nomes.txt é uma lista naquele padrão que vc falou.

#!/bin/bash
for a in $(cat ~/bin/nomes.txt) ; do
# adduser ${a%%;*} 2> /dev/null
echo ${a%%;*}
#echo $a
done


Nova edição pra usar o while como citado pelo companheiro abaixo.
#!/bin/bash
while read a
do
# adduser  ${a%%;*} 2> /dev/null
echo ${a%%;*}
#echo $a
done < ~/bin/nomes.txt
Dê-me um computador com o Tux que movo o mundo!

Linux User #323049

irtigor

#6
Esse seria o ponto, que só conhecendo a linguagem... o ideal é um while com o read como condição, nada de cat em um for.

---
Explicação: http://mywiki.wooledge.org/DontReadLinesWithFor

yusukibr

Fiz assim para criar usuário com o e-mail do arquivo usuario.txt e depois gerar uma senha aleatória, só que falta fazer com que ele gere um txt por usuário, com o nome e-mail e senha gerada, que compare o usuário com outro do sistema, e se houver mesmo nome que gere isso em um relatório no txt, também deve fazer com q no primeiro login de cada um, seja solicitada troca de senha.

#! /bin/bash

while read usuario email senha

do

useradd --create-home --shell "$SHELL" --user-group ${usuario%%;*} ${email%%;*} 2> /dev/null

senha=$RADOM|md5sum; head -c8


echo ${usuario%%;*} ${email%%;*}

echo $usuario $email $senha >> $usuario.txt


done < ~/listausuarios.txt


Citação de: selvaking online 28 de Setembro de 2013, 19:00
Rascunho inicial da sua idéia.
O arquivo ~/bin/nomes.txt é uma lista naquele padrão que vc falou.

#!/bin/bash
for a in $(cat ~/bin/nomes.txt) ; do
# adduser ${a%%;*} 2> /dev/null
echo ${a%%;*}
#echo $a
done


Nova edição pra usar o while como citado pelo companheiro abaixo.
#!/bin/bash
while read a
do
# adduser  ${a%%;*} 2> /dev/null
echo ${a%%;*}
#echo $a
done < ~/bin/nomes.txt


irtigor

Testou isso ai? Porque pelo que vejo, não deve funcionar. Pra leitura seria algo como


while IFS=';' read -r usuario email; do
    # faça alguma coisa.
done < "$1"


Pro que falta:

http://www.cyberciti.biz/faq/rhel-debian-force-users-to-change-passwords/
http://wiki.bash-hackers.org/scripting/posparams
http://wiki.bash-hackers.org/syntax/redirection

selvaking

Citação de: irtigor online 07 de Outubro de 2013, 17:12
Testou isso ai? Porque pelo que vejo, não deve funcionar. Pra leitura seria algo como

Se a pergunta foi feita pra mim. Testei sim! Não sei se tá 100 por cento a prova de falha, mas rodou!
Dê-me um computador com o Tux que movo o mundo!

Linux User #323049

yusukibr

#10
Ai pessoal vê ficou legal ai, só ta faltando a parte de gerar um arquivo txt como relatório de nomes já existentes e pedir q o usuário troque a senha no primeiro login, e também alterar o arquivo txt de cada usuario (chmod) para q só o root possa ter acesso.

#!/bin/bash



declare SHELL=" /bin/bash"

declare TEMPLATE=" /etc/skel"



declare SENHATEMP

declare SENHA



function guarda_info(){

 echo "Usuario: $usuario" >> $usuario.txt
 
 echo "Senha: $SENHATEMP" >> $usuario.txt

}






while  IFS=\; read usuario email

do

SENHATEMP=$(echo $RANDOM | md5sum | head -c8)

SENHA=$(mkpasswd $SENHATEMP)

useradd --create-home --user-group --skel $TEMPLATE --shell $SHELL --password $SENHA --comment $email $usuario

guarda_info

done <usuarios.txt


Citação de: selvaking online 07 de Outubro de 2013, 19:57
Citação de: irtigor online 07 de Outubro de 2013, 17:12
Testou isso ai? Porque pelo que vejo, não deve funcionar. Pra leitura seria algo como

Se a pergunta foi feita pra mim. Testei sim! Não sei se tá 100 por cento a prova de falha, mas rodou!

irtigor

Exit status:

http://linux.die.net/man/8/useradd
http://mywiki.wooledge.org/BashGuide/TestsAndConditionals

Fora isso, o único assunto não abordado foi o uso do chmod, que é bem trivial (com um zilhão de explicações por ai), mas qualquer coisa, diga-nos qual é a sua dúvida.