Distribuindo arquivos para máquinas em rede
Publicado por Heros Eloi Souza 29/12/2004
[ Hits: 8.190 ]
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
Retra de iptables para DMZ na porta 80
O que fazer após instalar o Debian 8 - versão em Shell Script
Testa a conexão com a internet e se não tem reinicia o pc.
Script Firewall Iptables + compartilhar internet
Verifica quais ports necessitam de atualização
Nenhum comentário foi encontrado.
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
IA chega ao desktop e impulsiona produtividade no mundo Linux
Atualizando o Fedora 42 para 43
Como saber se o seu e-mail já teve a senha vazada?
Como descobrir se a sua senha já foi vazada na internet?
Warcraft II Remastered no Linux? (6)
O programa assinador digital (5)









