Shell script para backup: nova versão

Outro dia atualizei o que faltava no meu shell script para fazer backup usando o rsync.

Adicionei o wakeonlan para ligar a máquina remotamente (necessário descobrir o HW address da sua máquina de destino e se certificar de que é possível ligá-la remotamente — possível que tenha que ativar essa opção na BIOS), 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)

Meu arquivo exclude, com a lista de arquivos e pastas que não serão incluídas no backup ficou assim:

.thumbnails/
Picasa.ini
Thumbs.db
.local/share/Trash/
.cache/
.gvfs/

11 respostas para “Shell script para backup: nova versão”

  1. Esse script de backup é FANTÁSTICO, PERFEITO para o que estou precisando, ele serve para estações que tenham win XP ou 7 para enviar o backup ao windows server 2008??? Valeuuuuu

  2. Oi Juliano, não faço idéia. Você está dizendo rodar o script por uma máquina com linux para enviar o backup para a máquina com windows? Se for isso talvez até funcione se vc tiver ssh instalado no windows (e o rsync). Agora rodar o script partir do windows acho que não funciona não… teria que portar pra outra linguagem como python ou perl.

  3. Como eu devo colocar no arquivo exclude para que não seja realizada a cópias de arquivos do tipo .mp3, .avi, etc..

    tentei de diversas formas e não funcionou.

  4. Oi Gabriel, é só colocar em uma nova linha: *.mp3

    Assim o comando não vai mais copiar arquivos terminados em mp3. No entanto, se vc quiser excluir os arquivos mp3 que já estiverem no destino (eg pq vc já havia rodado o rsync) basta acrescentar na linha de comando a opção –delete-excluded. Ele vai ler suas regras de exclusão e apagar estes arquivos no destino.

    Faça uns testes pra ver como funciona antes de rodar nos seus arquivos oficiais.

  5. Ótimo script… vc poderia torná-lo mais eficiente se na linha 54 “rsync -ah –delete –stats –progress –log-file=$LOG –exclude-…”, acrescentasse ao rsync a sintaxe ” rsync -Cravzup –delete –stats –progress –log-file=$LOG –exclude-from=$EXCLUIR -e ssh $SRC $USR@$DESTINO:$DIR

    ,ou seja, a sintaxe Cravzup

    C: auto-ignorar arquivos idênticos;
    -r: copiar de forma recursive, ou seja, todos os diretórios e subdiretórios no caminho especificado;
    -a: indica que estarão sendo copiados arquivos;
    -v: modo verboso, mais informações da cópia;
    -z: comprime os arquivos durante a cópia;
    – u : Update
    -p: indicador de progresso de cópia.

    Torna o backup mais eficiente…

    falows

    1. Valeu, legal que está usando 🙂

      O “-a” é equivalente à “-rlptgoD” portanto não precisaria do “-r” ou do “-p”. Na verdade o único que pode deixar mais eficiente é o “-z” que comprime os arquivos antes de enviar pela rede.

      O “-u” faz o backup pular os arquivos cuja cópia no destino está com a data de modificação mais nova. Isso é útil para fazer sincronização entre computadores, mas neste caso é um backup de uma via só, sempre do meu computador para outra máquina. Portanto, independente do arquivo ter sido modificado no destino (eg. posso ter entrado e acessado alguma coisa por ela), a cópia da minha máquina vai sobrepor.

      Já o “-p” serve para manter as permissões dos arquivos em ordem, o progresso é controlado pelo argumento “–progress”.

      Tem a lista completinha das opções do rsync aqui: http://www.samba.org/ftp/rsync/rsync.html

      Abraço

  6. Olá Nelas! Estou aprendendo como fazer script e comecei a pesquisar recentemente como posso realizar backup em um servidor (Backup) utilizando o SSH de outros servidores “clientes”. No seu script observei vc utilizando o SSH porém em que momento a senha de login é passada?

Os comentários estão desativados.