Distribuindo arquivos para máquinas em rede

Publicado por Heros Eloi Souza 29/12/2004

[ Hits: 7.813 ]

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 simples com iptables

Loadbalance FAILOVER V.5

Configuração de VLANs

LINUX+SAMBA+QUOTAS

Impedir duas ou mais conexões por usuário


  

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