Adicionando "automagicamente" usuários

Publicado por Iran Macedo (última atualização em 31/08/2010)

[ Hits: 13.289 ]

Download adiciona_usuario

Download 1283081968.adiciona_usuario (versão 2)




Uma das tarefas mais tediosas é criar usuários para rede Windows (Samba - PDC) em servidores Linux. É um tal de verifica se já existe esse usuário, adiciona, muda bash, troca senha... e isso usuário por usuário.

Pensando nisso criei um script que automatiza essa tarefa, deixando-nos apenas o trabalho de digitar o novo Login, Nome do usuário e seu Grupo principal. Esse script toma alguns cuidados, como verificar se o Login digitado já existe, verifica se já existe um diretório antigo em /home de algum outro usuário que usava o mesmo nome, trata letras digitadas em caixa alta, ativa a troca de senha no primeiro acesso para o novo usuário de forma automática e relê a configuração do Samba no final do uso do software.

Após rodar o programa e digitar os novos Login, Nome do usuário e grupo principal, basta revisar as informações e confirmar a entrada dos dados. Depois é só passar a senha genérica para o usuário do Samba (S3nh4123) e pedir para que ele faça logon em uma estação de trabalho Windows. Será pedida a troca da senha no primeiro logon. O seu trabalho? Feito em pequenos 5 passos! :)

Você pode adicionar 1, 10, 100 usuários numa única sessão. Depois de terminado e ao fechar o programa com um único comando, a configuração do Samba é relida automaticamente, validando suas modificações.

Também responde aos parâmetros -V ou --version e aos parâmetros -h ou --help.

Além da automação que este script oferece ao administrador, ele também é uma fonte de estudos para aqueles que estão correndo atrás para aprender Shell Script. ;)

Este script foi severamente testado nas distribuições Debian e Ubuntu. Está funcionando redondo. Mas se você encontrar algum bug, por favor, me comunique. Meu e-mail está no cabeçalho do script.

Espero que gostem! :)

  



Versões atualizadas deste script

Versão 2 - Enviado por Iran Macedo em 29/08/2010

Changelog: Corrigido um bug no comando "antivirus -V" ou "antivirus --version", onde o script apontava para um local fixo no computador local aonde foi criado.
O script corrigido pode ser baixado aqui.

*** Evite copiar o script direto da página. Sua exibição no HTML modifica alguns códigos e as cores dos textos não vão aparecer corretamente! Ao invés de copiá-lo, baixe o script que contem o código correto!

Abs.

Download 1283081968.adiciona_usuario


Esconder código-fonte

#!/bin/bash

#############################################################
#
# Script 1.1 para adicionar novos usuarios.
# Prepara usuarios para SAMBA em Primary Domain Controller (PDC).
#
#############################################################
#
# Programa: adiciona_usuario
# Versão 1.1
# Licença de uso: BSD
# Use, compartilhe, mantenha os créditos de quem criou e/ou ajudar a desenvolver.
#
#############################################################
#
# Versão 1.0 - Comandos sem tratamentos em bloco único.
# Versão 1.1 - Programa em blocos distintos, uso de funções, tratamentos de erros, validação das informações
#          passadas pelo usuário, cores, inclusão do -V e --version (versão) e do -h e --help (ajuda).
#          Tratamento na digitação das informações em letras maiúsculas. 
#          Cópia automática deste programa para /usr/bin/ no primeiro uso. Verifica permissões do usuário.
#
#############################################################
#
# Por Iran Macedo.
# E-mail: macedo dot if at gmail dot com
# última modificação: 15/08/2010.
#
#############################################################

param="$1" #Variável para Função Parametros. Devolve o primeiro parâmetro.
prog="$0" #Variável para Função Parametros. Devolve o comando utilizado para rodar este prog.
cicle=C
cadastro=0
rodou=0


# Verifica se o programa já está em /usr/bin. Se já está, segue sem alterações. Se não está,
# faz um hardlink deste para /usr/bin.
 instalado=$(ls /usr/bin/ |grep -sow $(basename "$0")) > /dev/null 2>&1

 if [ -z $instalado ];then
   ln "$prog" /usr/bin/adiciona_usuario
   clear
   echo ""
   echo -e "{FONTE}33[36;1m Olá! Rodando este programa pela primeira vez? :)

 Da próxima vez, rode este programa somente digitando o comando: {FONTE}33[0m
{FONTE}33[36;1;5m [ adiciona_usuario ]{FONTE}33[0m {FONTE}33[36;1m pelo seu Terminal.

 E lembre-se, este programa precisa ser rodado pelo Root ;)

 root@pc# adiciona_usuario{FONTE}33[0m

 Pressione [ ENTER ] para continuar..."
   read
 fi


#FUNÇÃO PRINCIPAL
###
Main() {

 Parametros
 Cores
 Title
 rodou=1

 case $cicle in
   [Ss]) Sair ;;
   [Cc]) Continue ;;
   *) Ops ;;
 esac

} #Fim Main


#FUNÇÃO PARAMETROS
# Se o usuário usar algum parametro, as informações serão passadas e o programa será fechado logo após.
# Parametros -V e --version (versão), -h e --help (ajuda).
###
Parametros() {

# Variável rodou verifica se o programa foi rodado por inteiro (adiciona_usuario)
# ou se foi utilizado um dos parâmetros (adiciona_usuario -V, por exemplo).

 if [ "$rodou" = "0" ];then
# param = $1, primeiro parâmetros após o comando.
 case "$param" in
   -V | --version) echo ""
      echo " Programa: "$(basename "$0" ) ;
# Pega a versão direto do cabeçalho.
      echo -n " Versão atual: " ;
      grep -m 1 "Versão" /etc/init.d/adiciona_usuario |cut -d - -f 1 |tr -d \# ;
# Pega a data da modificação direto do cabeçalho.
      echo -n " Data da última modificação: " ;
      grep -m 1 "modificação" /etc/init.d/adiciona_usuario |cut -d : -f 2 |tr -d \# ;
      echo " Criado por Iran Macedo."
      echo "";
      exit 0 ;;
   -h | --help) Mensagem_Uso ;
      exit 0 ;;
# Para qualquer outro parametro, mensagem de uso.
# Caso $param tenha um outro parâmetro, inválido.
   *) if [ -n "$param" ];then
      echo ""
      echo -e "{FONTE}33[31;1;5m Ooops!!!"
      echo -e " Opção inválida: $param!{FONTE}33[0m"
      echo 
      echo " Parâmetros válidos: "
      echo " -h | --help |-V | --version"
      exit 1
      fi ;;
 esac
 fi 

} #Fim Parametros


#FUNÇÃO DE AJUDA
# Esta função é invocada quando utilizados os parametros -h ou --help.
###
Mensagem_Uso() {

 clear
 echo "
 adiciona_usuario"
 echo -n "
 Local do arquivo ";whereis adiciona_usuario
 echo "
 Programa para adição de usuários Windows no PDC Samba.

 Para evitar erros, propositalmente não coloquei aqui as opções de
 desabilitar ou excluir usuários do PDC. Caso seja esta a sua necessidade, utilize 
 o programa [ delete_usuario ] que pode ser baixado no site vivaolinux.com.br.
    
 Uso: $(basename "$0") [-h | -V]

 -h, --help      Opcional. Mostra esta tela de ajuda e sai.
 -v, --version      Opcional. Mostra a versão atual deste programa e sai.

 Para rodar o programa, digite [ adiciona_usuario ] no seu Terminal.

 Este programa adiciona um hardlink na pasta /usr/bin, não sendo necessário utilizar o caminho completo para o programa.

 Criado por Iran Macedo.
 "

} #Fim Mensagem_Uso


#FUNÇÃO TITULO
###
Title() {

 clear
 echo
 echo "   ***************************************************"
 echo "   * PROGRAMA PARA ADICIONAR NOVOS USUARIOS *"
 echo "   * SERVIDOR PDC - EMPRESA      versão 1.1            *"
 echo "   ***************************************************"
#XXX Mude o EMPRESA pelo nome da sua empresa! ;)
 echo

 if [ "$cadastro" = "1" ];then #Se já houve algum cadastro de usuário nesta sessão.
   echo -e "   * Ultimo usuário cadastrado: {FONTE}33[1;36m $LAST {FONTE}33[0m" #ULTIMO USUÁRIO REALMENTE CADASTRADO.
   echo -e "   * Ultimo login digitado:  {FONTE}33[1;36m  $NOME {FONTE}33[0m" #ULTIMA TENTATIVA DE CADASTRO.
 else
   echo -e "   * Ultimo usuário cadastrado: {FONTE}33[1;36m Nenhum {FONTE}33[0m"     
   echo -e "   * Ultimo login digitado:    {FONTE}33[1;36m  Nenhum {FONTE}33[0m"
 fi
   echo ""
# Verifica poderes de superadmin.
   if [ "$USER" != "root" ];then
      echo -e "   {FONTE}33[1;31m* Você não está logado como root!!! {FONTE}33[0m"
      echo "   * Por favor, verifique suas permissões!"
   echo ""
      exit 1
   fi

} #Fim Title


#FUNÇÃO Continue
###
Continue() {

 unset LOGIN
 echo -n "    - Digite o [ LOGIN ] do novo usuario: " ;
 read LOGIN ;
 # Tratando possível erro na digitação (em maiúsculas).
 LOGIN=$(echo "$LOGIN" |tr [[:upper:]] [[:lower:]])
 unset NAME ;

# Filtra o arquivo passwd e compara variável LOGIN com as entradas.
 NAME=$(cat /etc/passwd |grep -siow $LOGIN) > /dev/null 2>&1 ;

# Se variável NAME estiver vazia, usuário não existe. Continuamos.
 if [ -z "$NAME" ];then
   unset NOME
   unset GRUPO
   
   echo -n "    - Digite o [ NOME ] completo do novo usuario: " 
   read NOME
   
   echo -n "    - Digite o [ GRUPO ] principal do usuario: " 
   read GRUPO 
   # Tratando possível erro na digitação (em maiúsculas).
   GRUPO=$(echo "$GRUPO" |tr [[:upper:]] [[:lower:]])
   
   unset GROUP
# Filtra o arquivo group e compara variável GRUPO com as entradas.
   GROUP=$(cat /etc/group |grep -siow $GRUPO) > /dev/null 2>&1
   Verify # Próximo passo, função Verify.
   
# Se variável NAME estiver cheia, então o usuário existe. Chama Warn para avisar.
 else Warn
 fi ; 
 
 clear ;

} #Fim Continue


# $? = STATUS DO ÚLTIMO COMANDO DADO
# STATUS = 0 OU 1 (FUNCIONOU) <-- RESPOSTA DE SUCESSO DO GROUPADD!
#STATUS >= 2 E <= 6 (ERRO) <-- RESPOSTA DE ERRO DO GROUPADD!
#FUNÇÃO GRUPO
###
Add_group() {

 groupadd "$GRUPO" > /dev/null 2>&1

# Se o comando anterior (Add_group) retornar erros do 2 ao 6,
# apagar grupo adicionado e avisar. Voltar ao Principal.
###
 if [ $? -ge "2" -a $? -le "6" ];then #ASSEGURA CONTRA ERROS
   delgroup --only-if-empty --quiet $GRUPO > /dev/null 2>&1
   echo
   echo -e "{FONTE}33[1;31m    * Dados inválidos! Tente de novo. {FONTE}33[0m"
   echo
   echo "    * [ "$GRUPO" ] não pode ser utilizado como GRUPO!"
   echo "    * Pressione ENTER para Continuar."
   read 
   cadastro=1
   clear
   Main
 fi

 DONE=1 #SE DER ALGUM ERRO, SETA 1 SE O GRUPO FOI ADICIONADO.

} #Fim Add_group


#FUNÇÃO USUARIO
###
Add_user() { 

 groupadd "$LOGIN" > /dev/null 2>&1

# Se o comando anterior (Add_group) retornar erros do 2 ao 6,
# apagar grupo adicionado e avisar. Voltar ao Principal.
 if [ $? -ge "2" -a $? -le "6" ];then #ASSEGURA CONTRA ERROS
   test "$DONE" = "1" && delgroup --only-if-empty --quiet $GRUPO > /dev/null 2>&1
   echo
   echo -e "{FONTE}33[1;31m    * Dados inválidos! Tente de novo. {FONTE}33[0m"
   echo
   echo "    * [ "$LOGIN" ] não pode ser utilizado como LOGIN!"
   echo "    * Pressione ENTER para voltar."
   read ""
   cadastro=1
   clear
   Main
 fi

# Se não tivermos erros por comparação (DONE) ou erros do comando anterior
# (Add_user), adicionamos as demais informações do usuário.
 ls /home |grep -siow "$LOGIN" > /dev/null 2>&1

# Algumas vezes deletamos usuários, mas não apagamos as suas pastas.
# Desta forma, ao criar um novo usuário com o mesmo Login que um anterior,
# a possibilidade de erro ao usar uma pasta com permissões dúbias é grande.

 if [ "$?" = "0" ];then 
   delgroup --only-if-empty --quiet $GRUPO  > /dev/null 2>&1
   delgroup --only-if-empty --quiet $LOGIN  > /dev/null 2>&1
 echo " "
 echo -e "  {FONTE}33[1;31m  * Diretório já existente! Por favor, verifique o diretório /home! {FONTE}33[0m"
 echo "    * Pressione [ ENTER ] para voltar!"
 read
 Main
 fi

 useradd -d /home/"$LOGIN" -m -c "$NOME" -s /bin/false -g "$GRUPO" "$LOGIN" > /dev/null 2>&1
 gpasswd -a "$LOGIN" "users" > /dev/null 2>&1
 gpasswd -a "$LOGIN" "sambashare" > /dev/null 2>&1
 gpasswd -a "$LOGIN" "$LOGIN" > /dev/null 2>&1
 gpasswd -a "$LOGIN" "$GRUPO" > /dev/null 2>&1
#XXX Adicione mais grupos aqui, se necessário!

# OS DOIS COMANDOS ABAIXO SAO PARA USO DO SAMBA EM PDC
# CASO NAO USE PDC, COMENTE-OS!

# ESTA LINHA SETA A SENHA DO USUARIO.
 (echo "S3nh4123";echo "S3nh4123")| smbpasswd -s -a "$LOGIN" > /dev/null 2>&1

# Pede alteração de senha no primeiro logon do Windows (para uso de perfil remoto).
 net sam set pwdmustchangenow "$LOGIN" yes > /dev/null 2>&1

 echo
 echo "    * Usuario $NOME cadastrado com sucesso!"
 echo
 echo "    * Troca de senha no primeiro logon no Windows ativada!"
 echo
 echo -n "    * Grupos de "$LOGIN": ";groups $LOGIN
 echo
 unset cicle
 echo -n "    ** Pressione C para CONTINUAR ou S para SAIR: "
 read cicle
 clear
 cadastro=1 #SETA A VARIAVEL DO PAINEL (ULTIMO CADASTRO E LOGIN REALIZADO).
 DONE=0 #Zera variável DONE para ser utilizada por um novo usuário.

} #Fim Add_user


#FUNÇÃO WARNING
#CASO O LOGIN ESTEJA EM USO OU POSSUI CARACTERES INVÁLIDOS, ADMIN RECEBE AVISO.
###
Warn() {

 echo
 echo -e "{FONTE}33[1;31m   * ATENÇÃO!!! Login $LOGIN em uso ou inválido! {FONTE}33[0m"
 echo
 echo -n "   * Grupos de "$LOGIN": ";groups $LOGIN
 echo
 unset cicle 
 echo -n "    - Pressione C para CONTINUAR ou S para SAIR: "
 read cicle
 clear
 Main

} #Fim Warn


#FUNÇÃO VERIFICAR
# Somente pede a confirmação do usuário antes de continuar com o procedimento.
###
Verify() {

 echo
 echo "    * Estes dados estão corretos?"
 echo
 echo "        - LOGIN: "$LOGIN""
 echo "        - NOME:  "$NOME""
 echo "        - GRUPO: "$GRUPO""
 echo
 unset VER
 echo -n "    * Pressione S para SIM ou N para NÃO: "
 read VER
 Confirme #Após verificação, chama função Confirme.

} #Fim Verify


#FUNÇÃO CONFIRMAR
#RECEBE VARIAVEL VER DE VERIFY.
###
Confirme() {

 case $VER in
   [Ss]) if [ -z "$GROUP" ];then #SE RESPOSTA = SIM E NÃO EXISTIR O GRUPO...
          Add_group 
          Add_user 
        else #SE RESPOSTA = SIM E GRUPO EXISTIR.
          Add_user 
        fi ;
        LAST=$NOME ;;
   [Nn]) echo ; #SE RESPOSTA = NÃO...
        echo "     * Informações descartadas!" ;
        echo
        unset cicle ;
        echo -n "     * Pressione C para CONTINUAR ou S para SAIR: " ;
        read cicle ;
        clear ;
        Main ;;
      *) echo ; #PARA QUALQUER OUTRA RESPOSTA.
        echo "     * Opção inválida!: [ $VER ]" ;
        Verify ;;
 esac

# Independente da resposta, o programa loopa para Main.
 Main

} #Fim Confirme


#FUNÇÃO OPS
#PARA RESPOSTA INVALIDA DA FUNÇÃO PRINCIPAL
###
Ops() {

 echo -e "{FONTE}33[1;31m   *** ATENÇÃO!!!  OPÇÃO INVÁLIDA: [ "$cicle" ] {FONTE}33[0m" ;
 echo
 unset cicle ;
 echo -n "   *** Digite C para CONTINUAR ou S para SAIR: " ;
 read cicle ;
 clear ;

# Programa loopa para Main.
 Main ;

} #Fim Ops


#FUNÇÃO SAIR
#HORA DE RELER O SAMBA E VOLTAR PARA O TRABALHO :)
###
Sair() {

#XXX Estes são alguns meios de invocar o serviço do Samba. Verifique qual
# o seu Linux utiliza, descomente-o e comente os demais.
 service smbd reload ;
 service nmbd reload ;
 #service samba reload ;
 #/etc/init.d/samba reload ;

 clear ;
 echo " Seu último dígito: [ "$cicle" ]" #PARA O CASO DO PROGRAMA FECHAR E VC NÃO ENTENDER NADA.
 echo
 echo -e "{FONTE}33[1;31m Bye Admin! {FONTE}33[0m" ;
 echo ;
 exit 0 ;

} #Fim Sair


#FUNÇÃO CORES
# Carrega cores para os destaques em tela.
#XXX Adicione mais cores, caso necessário!
###
Cores() {

vermelho="{FONTE}33[0;31m"
ciano="{FONTE}33[0;36m"

} #Fim Cores

Main #ENCERRA A FUNÇÃO MAIN.


Scripts recomendados

Realizar backup automático no HD externo

Script em Bash para gerenciar as novas versões do Java e permitir escolher a versão pa

Checa Host

Distribuindo arquivos para máquinas em rede

Desligando infraestrutura de ITM6


  

Comentários
[1] Comentário enviado por SamL em 11/09/2010 - 22:12h

Gostei do sript e da palavra "automagicamente" xD

[2] Comentário enviado por xirux em 11/01/2012 - 15:02h

Caraca mano, simplesmente matou á pau!!


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts