Distribuindo arquivos para máquinas em rede
Publicado por Heros Eloi Souza 29/12/2004
[ Hits: 8.219 ]
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.
#!/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
Limpando cache do Squid (Baseado em Debian)
Remover kernels antigos com zenity
Ver último twitter pelo terminal ou na barra de notificação
Nenhum comentário foi encontrado.
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Ativando e usando "zoom" no ambiente Cinnamon
Vídeo Nostálgico de Instalação do Conectiva Linux 9
Como realizar um ataque de força bruta para desobrir senhas?
existe algum hub de jogos online similiar ou igual dos browser (6)
Como botar o efeito de deslocar janelas (win + setas - windows) no lin... (0)
Thinkpads são bons mesmo ?! (3)
Eu queria adicionar a incon do wifi e deixa transparente no fluxbox no... (2)









