No meu computador mantenho apenas arquivos essenciais para o trabalho da semana/mês e vou estocando tudo em discos rígidos externos progressivamente. Contudo, como eles são meio desorganizados, queria um jeito prático de fazer backup completo dos arquivos diários de trabalho.
A solução foi criar um shell script para backup (bash) que fizesse uma cópia exata do meu computador para outra máquina conectada na rede local.
Descobrindo o rsync
Depois de uma rápida pesquisa vi que o rsync era a ferramenta que estava procurando para o trabalho. Não é preciso muito para conseguir fazer o backup com o rsync, basta usar o seguinte comando (cheque a documentação para entender os argumentos):
rsync -ah --delete -e ssh /home/user1 user2@IPouHostname:/home/user2/Backup/Nota: O --delete faz com que os arquivos no destino sejam deletados, caso estejam ausentes na origem
No entanto, foi preciso configurar algumas coisas para que tudo corresse bem nas duas máquinas rodando Ubuntu.
Configurando o hostname
Como minha rede local é DHCP as máquinas não têm um IP estático. Queria rodar o script sem precisar saber o IP do destino usando apenas o hostname (nome da máquina na rede). Quando tentei conectar via ssh usando o hostname original não consegui. Para funcionar é necessário simplesmente mudar o hostname da máquina de destino para hostname.local.
Siga estas instruções resumidas abaixo:
- Abra o arquivo
/etc/hostscom um editor de texto pelo terminal comsudo vim /etc/hosts. - Mude a linha
127.0.1.1 hostnamepara127.0.1.1 hostname.local. - Salve o arquivo e abra o arquivo
/etc/hostnamecomsudo vim /etc/hostname. - Mude o
hostnameparahostname.locale salve. - Reinicie a máquina ou execute:
sudo /etc/init.d/hostname.sh stopsudo /etc/init.d/hostname.sh startsudo /etc/init.d/network restart
Com isso foi possível conectar via ssh sem precisar saber o IP, apenas com o hostname.
Truque com o ssh
Outra pendenguinha é que o ssh precisa da senha de usuário da máquina de destino para se conectar. Para evitar isso e conseguir fazer o login remotamente sem precisar digitar a senha, siga estes passos.
Isso permite com que você possa iniciar o backup sem precisar estar por perto, por exemplo, deixar agendado para rodar o script 1 vez por semana.
Execute o script
Com isso resolvido abra o script abaixo num editor de texto, edite os detalhes de configuração, salve e execute o script num terminal. Para executar torne o arquivo executável com o comando:
chmod 755 backup.she execute com
./backup.shConfigurando o wakeonlan
Também tentei fazer com que meu computador ligasse remotamente (wakeonlan), para que nem precisasse ligar a máquina de destino para fazer backup—o script a ligaria remotamente. Mas não consegui. Editado: Consegui! Veja a versão 0.2 mais abaixo.
Adicionei o wakeonlan para ligar a máquina remotamente. Para tal, é necessário descobrir o HW address da sua máquina de destino e se certificar de que é possível ligá-la remotamente. É possível ter que ativar essa opção na BIOS.
Descrição do script
O script abaixo basicamente:
- Checa se a máquina de destino está ligada (se estiver desligada ele avisa, põe no log e fecha).
- Se estiver ligada, ele executa o
rsync(o--delete-beforedeleta os arquivos do destino antes de copiar os arquivos novos; útil se não houver muito espaço no disco do destino—o padrão é--deleteque vai deletando e copiando progressivamente). - O terminal mostra todas as operações e calcula a duração do backup. Tudo isso fica registrado num arquivo log.
Obviamente sugestões são muito bem-vindas! Segue abaixo a versão 0.1 com então o script:
Versão 0.1
Versão inicial com as funcionalidades básicas, mas sem o wakeonlan (veja a versão 0.2 abaixo).
#!/bin/bash
# Script para backup via SSH usando o rsync
# Versão 0.1
## Configuração!!! ##
# Mude os parâmetros abaixo, referentes ao seu sistema
# Arquivo log
LOG=/home/user0/.backup`date +%Y-%m-%d`.log
# Destino
# IP ou hostname da máquina de destino
DESTINO=destino.local
# Usuário no destino
USR=user1
# Diretório de destino
DIR=/home/user1/Backup/
# Origem
# Diretório de origem
SRC=/home/user0
## Fim das Configurações!!! ##
# Checar se a máquina de destino está ligada
/bin/ping -c 1 -W 2 $DESTINO > /dev/null
if [ "$?" -ne 0 ];
then
echo -e `date +%c` >> $LOG
echo -e "\n$DESTINO desligado." >> $LOG
echo -e "Backup não realizado\n" >> $LOG
echo -e "--- // ---\n" >> $LOG
echo -e "\n$DESTINO desligado."
echo -e "Backup não realizado.\n"
else
HORA_INI=`date +%s`
echo -e `date +%c` >> $LOG
echo -e "\n$DESTINO ligado!" >> $LOG
echo -e "Iniciando o backup...\n" >> $LOG
rsync -ah --delete --stats --progress --log-file=$LOG -e ssh $SRC $USR@$DESTINO:$DIR
HORA_FIM=`date +%s`
TEMPO=`expr $HORA_FIM - $HORA_INI`
echo -e "\nBackup finalizado com sucesso!" >> $LOG
echo -e "Duração: $TEMPO s\n" >> $LOG
echo -e "--- // ---\n" >> $LOG
echo -e "\nBackup finalizado com sucesso!"
echo -e "Duração: $TEMPO s\n"
echo -e "Consulte o log da operação em $LOG.\n"
fi
# Afazeres
# - Incluir em cron job!
# - Definir como lidar com o arquivo.log (deletar, arquivar, deixar...)
# - Incluir wakeonlan para ligar o computador se estiver desligado
# - Desligar máquina de destino após o término do backup
# - Criar alça para quando a transferência falhar (e.g.,falta de espaço)Versão 0.2
Adicionei o wakeonlan. Dei uma arrumadinha, incluí a opção de excluir arquivos e pastas do backup (ver abaixo) e adicionei num cron job para fazer um backup diário. Além disso, o script desliga a máquina depois do fim do backup. Aqui está:
#!/bin/bash
# Script para backup via SSH usando o rsync
# Versão 0.8 - 2009/09/05
# # # # # # Configuração # # # # # #
# Mude os parâmetros abaixo, referentes ao seu sistema
# Arquivo log
LOG=/home/user0/.backup`date +%Y-%m-%d`.log
# IP ou hostname da máquina de destino
DESTINO=destino.local
# Usuário no destino
USR=user1
# Diretório de destino
DIR=/home/user1/Backup/
# Diretório de origem
SRC=/home/user0
# Arquivo com lista de arquivos e diretórios
# que não serão incluídos no backup
EXCLUIR=/home/user0/.rsync/exclude
# HW address
HW=00:ee:dd:cc:bb:aa
# # # # # # Configuração # # # # # #
# # # # # # # Funções # # # # # # #
function ligada
{
# Checar se a máquina de destino está ligada
echo -e "Checando se $DESTINO está ligada..."
/bin/ping -c 1 -W 2 $DESTINO > /dev/null
if [ "$?" -ne 0 ]; then
return 1
else
return 0
fi
}
function run_backup
{
HORA_INI=`date +%s`
echo -e `date +%c` >> $LOG
echo -e "\n$DESTINO ligado!" >> $LOG
echo -e "Iniciando o backup...\n" >> $LOG
rsync -ah --delete --stats --progress --log-file=$LOG --exclude-from=$EXCLUIR -e ssh $SRC $USR@$DESTINO:$DIR
HORA_FIM=`date +%s`
TEMPO=`expr $HORA_FIM - $HORA_INI`
echo -e "\nBackup finalizado com sucesso!" >> $LOG
echo -e "Duração: $TEMPO s\n" >> $LOG
echo -e "--- // ---\n" >> $LOG
echo -e "\nBackup finalizado com sucesso!"
echo -e "Duração: $TEMPO s\n"
echo -e "Consulte o log da operação em $LOG.\n"
}
# # # # # # # Funções # # # # # # #
# # # # # # # Programa # # # # # # #
# Checar se a máquina de destino está ligada
ligada
if [ "$?" -eq "1" ]; then
echo -e "\n$DESTINO desligado. Tentando acordá-lo..."
wakeonlan $HW
echo -e "\nPacote mágico enviado. Aguarde."
sleep 70
ligada
if [ "$?" = "1" ]; then
echo -e `date +%c` >> $LOG
echo -e "\n$DESTINO desligado." >> $LOG
echo -e "Backup não realizado\n" >> $LOG
echo -e "--- // ---\n" >> $LOG
echo -e "\n$DESTINO desligado."
echo -e "Backup não realizado.\n"
else
echo -e "\n$DESTINO ligado! Começando o backup..."
run_backup
fi
else
echo -e "\n$DESTINO ligado! Começando o backup..."
run_backup
fi
echo -e "Desligando o $DESTINO..."
ssh $USR@$DESTINO 'sudo halt'
echo -e "Pronto. Tchau!"
# # # # # # # Programa # # # # # # #
# # # # # # # Afazeres # # # # # # #
#
# - Criar alça para quando a transferência falhar (e.g.,falta de espaço)
10 respostas em “Shell script para backup usando rsync e ssh em DHCP no Ubuntu”
Boas
Quanto ao WOL se o computador estiver que esta na sua rede local basta instalar o wakeonlan (no pc que executa o script) com o seguinte comando:
sudo apt-get install wakeonlan etherwake
apos isto para acordar o pc basta meter o comando:
wakeonlan -p 7 00:11:22:33:44:55
onde o parâmetro “-p 7” é o numero da porta (porta 9 por defeito) e onde “00:11:22:33:44:55” é o mac adress do computador que quer acordar.
Agora só tem de integrar este comando no seu script na parte onde manda o Ping e verifica se o computador esta desligado.
Caso ele esteja desligado entao manda o “Pacote magico” e volta atras no script voltando a verificar se o pc já esta acordado.
Eu até completava o script por você mas não ando dentro de shell scripting ultimamente.
:D
Opa, valeu! Na verdade tentei tudo isso e mais algumas coisinhas, mas o computador não ligou. Por isso nem incluí nada no script. Qualquer dia desses tentarei de novo.
abs
Ola amigo, estava procurando isso mesmo, mas tenho uma duvida.
Este Script faz com que os arquivos sejam Sobrescritos na maquina de backup ?
obrigado
Outra duvida é se seria possivel temporizar este comando ? para que de hora em hora ele faça um rsync .;
Olá Eduardo, sim se você atualizar os arquivos na sua máquina de origem os arquivos na máquina de destino serão sobrescritos.
Para temporizar tente um cronjob (exemplos) que executa o script no intervalo que você definir.
rsync rocks! =D
[…] Outro dia atualizei o que faltava no meu shell script para fazer backup usando o rsync. […]
Nelas, muito bom!
Pena que agora eu só estou trabalhando com mac e usando o time machine, mas com certeza, irei esbarrar nos linux da vida mais algumas vezes…
Excelent!!
Utilizei no SUSE fazendo algumas poucas adaptações e funfou direitinho!
Thanks.
Legal :)
Você viu a versão atualizada, né?
Reply by Email
or