Tagged: shell script RSS Toggle Comment Threads | Keyboard Shortcuts

  • nelas 23:08 on 2010/01/24 Permalink | Reply
    Tags: , , , shell script, , utilidades   

    Shell script para backup: nova versão 

    Translate original post with Google Translate

    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/

     
    • Paul 14:22 on 2010/01/26 Permalink | Reply

      gostei!

    • Juliano 14:46 on 2010/06/09 Permalink | Reply

      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

    • nelas 11:01 on 2010/06/10 Permalink | Reply

      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.

    • Gabriel Nunes 17:17 on 2010/11/22 Permalink | Reply

      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.

    • nelas 16:14 on 2010/11/27 Permalink | Reply

      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.

    • Loiro Jones 10:52 on 2011/09/13 Permalink | Reply

      Muito bom script, estou utilizando no meu servidor de arquivos para backup…

    • Loiro Jones 12:09 on 2011/09/13 Permalink | Reply

      Ó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

      • nelas 21:47 on 2011/09/14 Permalink | Reply

        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

  • nelas 10:00 on 2009/08/07 Permalink | Reply
    Tags: , bash, dhcp, , , script, shell script,   

    Shell script para backup usando rsync e ssh em DHCP no Ubuntu 

    Translate original post with Google Translate

    [Fiz uma versão nova, mais completa, deste script. Confira aqui.]

    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 script em shell (bash) que fizesse uma cópia exata do meu computador para outra máquina conectada na rede local.

    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 de precaução: 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.

    Como minha rede local é DHCP as máquinas não tem 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:

    1. Abra o arquivo /etc/hosts com um editor de texto pelo terminal

      sudo vim /etc/hosts

    2. Mude a linha

      127.0.1.1 hostname

      para

      127.0.1.1 hostname.local

    3. Salve o arquivo e abra o arquivo /etc/hostname com

      sudo vim /etc/hostname

    4. Mude o hostname para hostname.local e salve
    5. Reinicie a máquina ou execute:
      1. sudo /etc/init.d/hostname.sh stop
      2. sudo /etc/init.d/hostname.sh start
      3. sudo /etc/init.d/network restart

    Com isso foi possível conectar via ssh sem precisar saber o IP, apenas com o hostname. Outra pendenguinha é que o ssh precisa da senha de usuário da máquina de destino para se conectar. Pra 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).

    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.sh

    e execute com

    ./backup.sh

    Tentei fazer com que meu computador ligasse remotamente (para que nem precisasse ligar a máquina de destino pra fazer backup – o script a ligaria remotamente), mas não consegui. Tem instruções sobre o wakeonlan aqui.

    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-before deleta 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 é –delete que 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 então o script:

    #!/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)
    
     
    • Stt@L 23:19 on 2009/08/07 Permalink | Reply

      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

      • nelas 20:29 on 2009/08/09 Permalink | Reply

        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

    • Eduardo Peçanha 14:30 on 2009/10/04 Permalink | Reply

      Ola amigo, estava procurando isso mesmo, mas tenho uma duvida.
      Este Script faz com que os arquivos sejam Sobrescritos na maquina de backup ?
      obrigado

    • Eduardo Peçanha 14:32 on 2009/10/04 Permalink | Reply

      Outra duvida é se seria possivel temporizar este comando ? para que de hora em hora ele faça um rsync .;

    • nelas 17:15 on 2009/10/06 Permalink | Reply

      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.

    • Paul 16:44 on 2009/11/12 Permalink | Reply

      rsync rocks! =D

    • Gepeto 9:01 on 2010/03/06 Permalink | Reply

      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…

    • Cris 12:01 on 2010/08/20 Permalink | Reply

      Excelent!!
      Utilizei no SUSE fazendo algumas poucas adaptações e funfou direitinho!
      Thanks.

c
compose new post
j
next post/next comment
k
previous post/previous comment
r
reply
e
edit
o
show/hide comments
t
go to top
l
go to login
h
show/hide help
shift + esc
cancel