// Título: Sincronização com rsync
// Autor: guilez
// Data: 15/01/2012
As transferências de arquivos/backups sempre existiram para roubar nosso precioso tempo, principalmente quando se fala de conexões ruins. Você poderá deixar de lado o protocolo FTP, onde cada vez que tinha de fazer backup do seu servidor, muito demorava para fazer a transferência de 300MB de todos aqueles arquivos. Ainda, por mais que você fizesse a sincronização baseada nos datas de modificação de arquivos, chegando naquele único arquivo enorme, teríamos uma chateação.
O rsync (remote synchronization) supera facilmente os problemas já citados, é uma grande ferramenta quando se trata de sincronização de arquivos. Só realiza a transferência de arquivos com alteração na comparação cliente-servidor. Além deste fato, para você não precisar fazer a transferência daquele grande arquivo, com poucas modificações na comparação, este programa quebra os arquivos em diversas partes/pacotes e então faz uma lista de comparação, realizando assim a transferência apenas das partes diferenciadas e por fim reconstruindo o arquivo, remontando as partes, no outro lado da comunicação, gerando um ganho muito grande em velocidade.
Outros pontos muito importantes que o rsync carrega são a segurança e a compressão pré-transferência. No aspecto de segurança, o rsync, herdou de seus antepassados traços do ssh, realizando assim uma comunicação segura, e não permitido que um sniffer na rede venha a revelar tudo; Já a compressão antes do envio e descompressão assim que recebida a informação, ajuda e muito reduzir a largura de banda a ser utilizada, ganhando novamente em velocidade.
Vamos a sintaxe, traduzida da man page:
Nota: Leia-se “download” como o ato de realizar a sincronização levando como base os arquivos remotos; e da mesma forma, porem levando como base os arquivos locais, leia-se “upload”.Código:Local: rsync [OPÇÕES] ORIGEM [DESTINO] Acesso via shell remota: Download: rsync [OPÇÕES] [USUÁRIO@]HOST:ORIGEM [DESTINO] Upload: rsync [OPÇÕES] ORIGEM [USUÁRIO@]HOST:DESTINO Acesso via rsync daemon: Download: rsync [OPÇÕES] [USUÁRIO@]HOST:: ORIGEM [DESTINO] rsync [OPÇÕES] rsync://[USUÁRIO@]HOST[:PORTA]/ORIGEM [DESTINO] Upload: rsync [OPÇÕES] ORIGEM [USUÁRIO@]HOST::DESTINO rsync [OPÇÕES] ORIGEM rsync://[USUÁRIO@]HOST[:PORTA]/DESTINO
Iremos criar um situação imaginária, bem simples por sinal, para por em prática o funcionamento deste aplicativo. Imaginemos que existe um servidor (no exemplo foi utilizado o alwaysdata.com) onde existe suporte a ssh, e que necessitamos fazer backups diários do conteúdo do diretório /www, salvando-os na pasta /backup de nossa máquina.
Veja o significado das opções solicitadas, em sua respectiva ordem:Código:guilez@invaders-desktop:~$ rsync -Cravzp --progress --delete-excluded guilez@ssh.alwaysdata.com:www/ home/guilez/backup/
Dica: Acesse a man page [~$ man page rsync (ou acesse a versão html)] para ver todas as opções existentes.Código:-C, --cvs-exclude auto-ignore files in the same way CVS does -r, --recursive recurse into directories -a, --archive archive mode; equals -rlptgoD (no -H,-A,-X) -v, --verbose increase verbosity -z, --compress compress file data during the transfer -p, --perms preserve permissions --progress show progress during transfer --delete-excluded also delete excluded files from dest dirs
Mas isso seria um tanto chato, não? Toda vez que fossemos até o terminal e executássemos esta tarefa, teríamos de nos logar no servidor, digitar a senha...
Nada que um script que automatize isto não resolva, não é mesmo? Podemos utilizar o expect, então mãos à obra.
A primeira vista tudo parece tudo perfeito. O script faz todo o trabalho sozinho, só precisamos executá-lo e está funcionando de acordo com o esperado. Mas a realidade não é bem essa. Nossa senha esta incluída dentro do nosso próprio código, será que estamos por jogar fora toda a segurança tão almejada, inclusive pela escolha da utilização do ssh?Código:#!/usr/bin/expect -f #autosync.exp set timeout 100 set username "guilez" set password "**********" set server "ssh.alwaysdata.com" spawn rsync -Cravzp --progress --delete-excluded $username@$server:www/ /home/guilez/backup/ expect "*?assword:*" { send "$password\r" } interact;
A resposta para evitar este tipo de autenticação é utilizar o OpenSSH, vamos à linha de comando.
Atenção: Aperte <ENTER> em todas as opções.Código:guilez@invaders-desktop:~# openssh -t rsa
Foram criados dois arquivos, sendo um deles a chave pública (/home/guilez/.ssh/id_rsa.pub), a qual deve enviada para o servidor.
Atenção: A chave privada deve permanecer apenas com o proprietário e não deve ser divulgada.Código:guilez@invaders-desktop:~# cat ~/.ssh/id_dsa.pub | ssh guilez@ssh.alwaysdata.com 'cat - >> ~/.ssh/authorized_keys'
Agora nossa autenticação se dará de forma automatica e mais segura. Podemos, mais tranquilamente, preparar um script para automatizar algumas tarefas e nos oferecer algum conforto.
Oque vocês acham de nós irmos implementando, mesmo que aos poucos, este script?Código:#!/bin/bash # sync.sh # # Site : http://www.forum-invaders.com.br/ # Autor : guilez # E-mail: guilezguy[at]gmail[dot]com LOG=/var/log/sync.log echo -ne "\nUsuário: " && who | sed 's/[^A-Za-z0-9]* .*//g' >> $LOG echo -n "Data: " && date +%d/%m/%Y >> $LOG echo -n "Dia: " && date +%A >> $LOG echo -n "Horário: " && date +%H:%M:%S >> $LOG rsync -Cravzp --progress --delete-excluded guilez@ssh.alwaysdata.com:www/ home/guilez/backup/
Bibliografia/Complementos:
Repositório rsync: http://www.samba.org/ftp/rsync/
rsync README: http://www.samba.org/ftp/rsync/README
How Rsync Works A Pratical Overview: http://rsync.samba.org/how-rsync-works.html
The rsync algorithm: http://rsync.samba.org/tech_report/tech_report.html
A Tutorial on Using rsync: http://everythinglinux.org/rsync/
Pessoal, críticas construtivas são muito bem vindas. Perdoem qualquer erro.
Ficou bem simples, mas espero que tenham gostado.
Abraços.



Responder com Citação
