Distribuindo arquivos para máquinas em rede

Publicado por Heros Eloi Souza 29/12/2004

[ Hits: 7.935 ]

Download envia_arquivos.sh




Gostaria de compartilhar com vocês um script que fiz para distribuição arquivos numa rede Linux. A idéia surgiu a partir da necessidade de atualizar arquivos de configuração das estações de trabalho da rede. Poupa o trabalho de ficar fazendo scp toda hora e acabar esquecendo de alguma máquina.

  



Esconder código-fonte

#!/bin/bash
#
# Autor: Heros Eloi (heroseloi@gmail.com)
#
# Este script tem a intenção de distribuir arquivos de qualquer natureza 
# para computadores conectados em rede. 
# 
# Licensa: GPL
#
# Para maior compreenssão, vamos chamar de "servidor" a máquina de origem
# dos arquivos a serem distribuidos e "cliente" a máquina que receberá 
# o arquivo via scp.
#
# Para que o script funcione verifique se os requisitos abaixo estão atendidos:
#
# 1 - Necessário openssl (servidor e cliente) versão >= 0.9
# 2 - Pacote dialog (servidor) com versão >= 0.9
#
# ----------------------
#
# Importante
#
# Este script envia os arquivos com base no nome das máquinas.
# Exemplo:
# scp /tmp/arquivo.conf maquina1:/etc/
#
# Portanto verifique se os nomes contidos no arquivo mencionado abaixo 
# ($LISTA_HOSTS) podem ser acessados via rede. Para solucionar isso 
# configure um dns na sua rede e alere o '/etc/resolv.conf' ou adicione
# os hosts no arquivo '/etc/hosts'
#
# ----------------------
#
# Mais rápido
#
# Numa situação onde são enviados muitos arquivos para muitos hosts é 
# interessante que essa conexão seja feita sem pedir senha usando chave
# pública para conexões ssh. Fica mais rápido e poupa o trabalho de 
# ficar digitando senha para cada envio.
#
# Indico alguns tutoriais que ensinam a fazer isso:
# http://www.linuxit.com.br/modules.php?name=Sections&op=viewarticle&artid=187
# http://www.underlinux.com.br/modules.php?name=Sections&op=viewarticle&artid=218
# ----------------------
#
# Instalação
# 
# Para definir quais as maquinas da sua rede que receberão os arquivos, crie 
# um arquivo com qualquer nome e adicione o caminho dele no parametro 
# 'LISTA_HOSTS'.
# Esse arquivo deverá ter tres colunas separadas por <TAB> como segue o
# modelo abaixo.
#
# Exemplo:
# ----------------------------------------------
# nomedamaquina   ip      qualquercaracter
# ----------------------------------------------
# maquina1   10.1.0.30   .
# maquina8   10.1.0.12   .
# 
LISTA_HOSTS=/etc/hosts_ativos
#
# Este arquivo será criado automaticamente contendo listagem dos hosts
# selecionados pelo usuario
LISTAGEM_HOSTS=/tmp/listagem_hosts
> $LISTAGEM_HOSTS
#
# ponto de partida para selecao de arquivos
DIRETORIO_BASE=/mnt/backup/
#
# Este arquivo é criado automaticamente contendo listagem dos arquivos 
# selecionados pelo usuario
LISTAGEM_ARQUIVO=/tmp/listagem_arquivos
> $LISTAGEM_ARQUIVO
#
#
#
#
#########################################################################
# funcao que faz a selecao dos hosts para onde serao enviados os arquivos
#########################################################################
selecao_dos_hosts()
{
SELECAO_HOST=$(dialog            \
--stdout               \
--separate-output            \
--title      "Envio de arquivos"      \
--checklist   "Escolha o host destino"   \
0 0 0                  \
$(for i in `cat $LISTA_HOSTS`; do echo -e "$i\n"; done 2>> /dev/null) )

if [ $? -eq 0 ]
then
# se o usuario nao selecionou nenhum host
SELECAO_HOST=`echo ${SELECAO_HOST:="vazia"}`

   if [ $SELECAO_HOST == "vazia" ]
   then
      selecao_host_vazio
      selecao_dos_hosts
   else
      echo $SELECAO_HOST >> $LISTAGEM_HOSTS
      return 0
   fi
else
   return 1
fi
}

#########################################################################
# funcao que faz a selecao dos arquivos a serem enviados
#########################################################################
selecao_dos_arquivos()
{
SELECAO_ARQUIVO=$(dialog   \
--stdout         \
--title "Envio de arquivos"   \
--fselect $DIRETORIO_BASE   \
10 80)

if [ $? -eq 0 ]
then
   verifica_arquivo
else
   finalizacao
fi
}

########################################################################
# usuario nao selecionou nenhum host para envio
# ########################################################################
selecao_host_vazio()
{
dialog                                                  \
--title "AVISO"                                         \
--msgbox "\nPelo menos um host deve ser selecionado!\n"   \
9 40
}

#########################################################################
# arquivo nao existe
#########################################################################
arquivo_nao_existe()
{
dialog                           \
--title "AVISO"                        \
--msgbox "\n$SELECAO_ARQUIVO\n\nnão existe ou não é um arquivo!\n"   \
9 40      
}

#########################################################################
# confirma inclusao de arquivo
#########################################################################
confirma_arquivo()
{
dialog                                                  \
--title "AVISO"                                         \
--yesno "\nConfirma o envio do arquivo $SELECAO_ARQUIVO ?\n\n"  \
0 0
}

#########################################################################
# confirmação para o envio de mais arquivos
#########################################################################
envia_mais_arquivo()
{
dialog                                                  \
--title "AVISO"                                         \
--yesno "\nDeseja selecionar mais algum arquivo?\n\n"  \
0 0
}

#########################################################################
# exibe os arquivos selecionados pelo usuario
#########################################################################
arquivos_selecionados()
{
dialog                  \
--title "Arquivos a serem enviados"      \
--textbox $LISTAGEM_ARQUIVO         \
0 0
}

#########################################################################
# exibe os hosts que receberão os arquivos selecionados
#########################################################################
hosts_selecionados()
{
dialog                  \
--title "Hosts que receberão os arquivos"   \
--textbox $LISTAGEM_HOSTS         \
0 0
}

#########################################################################
# verificação e confirmação do arquivo selecionado
#########################################################################
verifica_arquivo()
{
if [ -f $SELECAO_ARQUIVO ]
then
   confirma_arquivo
   
   if [ $? -eq 0 ] # cofirma sim
   then
   # grava selecao em arquivo
   echo $SELECAO_ARQUIVO >> $LISTAGEM_ARQUIVO
   envia_mais_arquivo
      
      if [ $? -eq 0 ]
      then
      selecao_dos_arquivos
      else 
      arquivos_selecionados
      hosts_selecionados
      fi
   else
   selecao_dos_arquivos
   fi
else
   arquivo_nao_existe
   selecao_dos_arquivos
fi
}

#########################################################################
# mensagem final ao usuario
#########################################################################
finalizacao()
{
dialog                           \
--title "Saindo..."                     \
--infobox "\nObrigado por usar este script!\n\nheroseloi@gmail.com\n"   \
0 0
sleep 2s
exit 0
}
#########################################################################
# o usuario informa o diretorio onde os arquivos serão salvos no host
#########################################################################
diretorio_destino_host()
{
CAMINHO_DESTINO_HOST=$(dialog               \
--stdout                     \
--title "Diretório destino"               \
--inputbox "Insira o caminho onde os arquivos serão salvos:"   \
7 60)
   if [ $? -ne 0 ]
   then
   finalizacao
   fi
}

#########################################################################
# faz o scp para as maquinas
#########################################################################
envio_dos_arquivos()
{
dialog                  \
--title "Aguarde"            \
--infobox "\nEnviando os arquivos..."      \
0 0

VAR_HOST=`cat $LISTAGEM_HOSTS`
VAR_HOST=`echo ${VAR_HOST:="vazia"}`

contador=1
# divide as palavras
AUX_HOST=`echo $VAR_HOST | awk '{print $'$contador'}'`

   # enquanto variavel não é nula
   while [ ! -z $AUX_HOST ]
   do
   echo -e "\nMaquina $AUX_HOST:"
   
      for AUX_ARQ in `cat $LISTAGEM_ARQUIVO`
      do
      scp $AUX_ARQ $AUX_HOST:$CAMINHO_DESTINO_HOST
      done
      
   contador=`expr $contador "+" 1`
   AUX_HOST=`echo $VAR_HOST | awk '{print $'$contador'}'`
   echo -e "\nTecle <ENTER>\c"
   read lixo
   done
echo -e "\nArquivos enviados...\nTecle <ENTER>\c"
read lixo
finalizacao
}

#########################################################################
# funcao principal
#########################################################################
selecao_dos_hosts
if [ $? -eq 0 ]
then
   selecao_dos_arquivos
   diretorio_destino_host
   envio_dos_arquivos
else
   finalizacao
fi

Scripts recomendados

Firewall com iproute2 para 2 links com ip fixo

Tagtools - Slackware

Monitoração do CBQ

Iniciar nova instância do Firefox quando o mesmo não está respondendo

Bashblog v3.0 - cria um microblog em HTML5


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts