SCP e rsync: transferindo arquivos com segurança

1. Introdução à Transferência Segura de Arquivos

Em administração de sistemas, transferir arquivos entre servidores é tarefa cotidiana. Protocolos antigos como FTP e HTTP transferem dados em texto claro, expondo credenciais e conteúdo a interceptações. SCP e rsync utilizam o protocolo SSH como base, garantindo criptografia ponta a ponta, autenticação robusta e integridade dos dados.

Casos de uso típicos incluem backups automatizados entre servidores, deploy de aplicações em produção, sincronização de logs centralizados e distribuição de arquivos de configuração em clusters. Ambos os comandos são nativos em sistemas Unix-like e essenciais no repertório de qualquer administrador.

2. SCP (Secure Copy) - Comandos Essenciais

O SCP é uma ferramenta simples e direta para cópia segura de arquivos. Sua sintaxe básica segue o padrão:

scp [opções] origem destino

Copiar um arquivo local para um servidor remoto:

scp relatorio.pdf usuario@servidor:/home/usuario/documentos/

Copiar um arquivo remoto para o diretório local:

scp usuario@servidor:/backup/dados.sql ./dados.sql

Para diretórios inteiros, use a opção -r (recursiva):

scp -r /var/log/nginx/ usuario@servidor:/backup/logs/

Quando o servidor SSH escuta em porta não padrão, especifique com -P (maiúsculo):

scp -P 2222 script.sh usuario@servidor:/tmp/

Para preservar timestamps e permissões originais, utilize -p (minúsculo):

scp -p config.txt usuario@servidor:/etc/app/

3. Opções Avançadas do SCP

Limitar a largura de banda evita saturação da rede. A opção -l define o limite em Kbit/s:

scp -l 500 arquivo_grande.iso usuario@servidor:/backup/

O modo silencioso (-q) suprime a barra de progresso e mensagens não críticas:

scp -q dados.sql usuario@servidor:/backup/

Para depuração, o modo verbose (-v) exibe detalhes da conexão SSH:

scp -v script.sh usuario@servidor:/tmp/

Se você utiliza múltiplas chaves SSH, especifique qual usar com -i:

scp -i ~/.ssh/chave_empresarial.pem relatorio.pdf usuario@servidor:/home/

4. rsync - Sincronização Eficiente

O rsync é mais que um copiador: ele compara arquivos fonte e destino, transferindo apenas as diferenças (transferência incremental). Isso reduz drasticamente o tráfego em sincronizações repetidas.

Sintaxe básica:

rsync [opções] origem destino

Sincronização local:

rsync -av /origem/dados/ /destino/backup/

Sincronização remota (envio):

rsync -av /home/usuario/projeto/ usuario@servidor:/backup/projeto/

Sincronização remota (recebimento):

rsync -av usuario@servidor:/backup/projeto/ /home/usuario/projeto/

5. Opções Essenciais do rsync

A combinação mais comum é -avz:

  • -a (archive): modo recursivo que preserva permissões, proprietário, grupo, timestamps e links simbólicos
  • -v (verbose): exibe progresso detalhado
  • -z (compress): compacta dados durante a transferência, ideal para redes lentas
rsync -avz /var/www/ usuario@servidor:/backup/www/

Excluir arquivos ou padrões com --exclude:

rsync -av --exclude='*.log' --exclude='cache/' /app/ usuario@servidor:/backup/app/

Para exclusões complexas, use um arquivo de regras com --exclude-from:

rsync -av --exclude-from=/etc/rsync_exclude.txt /dados/ usuario@servidor:/backup/

O modo dry-run (--dry-run ou -n) simula a operação sem transferir nada:

rsync -av --dry-run /dados/ usuario@servidor:/backup/

Isso permite revisar o que será feito antes de executar a sincronização real.

6. Comparação Prática: SCP vs rsync

Característica SCP rsync
Transferência incremental Não Sim
Compressão durante trânsito Não nativa Sim (-z)
Preservação de atributos Limitada (-p) Completa (-a)
Exclusão de arquivos Não Sim (--exclude)
Simulação prévia Não Sim (--dry-run)
Velocidade em primeira execução Similar Similar
Velocidade em execuções subsequentes Mesma Muito superior

Use SCP para transferências únicas e simples: enviar um script, um arquivo de configuração, ou quando a simplicidade é prioridade. Use rsync para backups periódicos, sincronizações frequentes, grandes volumes de dados e quando precisar de controle granular sobre o que copiar.

Em redes lentas, o rsync com compressão (-z) supera o SCP significativamente, pois transfere apenas blocos modificados.

7. Boas Práticas e Segurança

Nunca exponha senhas em scripts. Configure autenticação por chave SSH:

ssh-keygen -t ed25519 -f ~/.ssh/chave_servidor
ssh-copy-id -i ~/.ssh/chave_servidor.pub usuario@servidor

Use o ssh-agent para gerenciar chaves com senha:

eval $(ssh-agent)
ssh-add ~/.ssh/chave_servidor

Para automatizar transferências com cron, crie scripts que registrem erros:

rsync -avz /dados/ usuario@servidor:/backup/ >> /var/log/backup.log 2>&1

Verifique a integridade dos arquivos após transferências críticas com checksums:

scp dados.tar.gz usuario@servidor:/backup/
ssh usuario@servidor "md5sum /backup/dados.tar.gz" > checksum_remoto.txt
md5sum dados.tar.gz > checksum_local.txt
diff checksum_local.txt checksum_remoto.txt && echo "Integridade OK"

8. Exemplos Práticos em Scripts Bash

Script de backup diário com rsync e log de erros:

#!/bin/bash
ORIGEM="/var/www/html"
DESTINO="usuario@servidor:/backup/site/"
LOG="/var/log/backup_$(date +%Y%m%d).log"

rsync -avz --delete --exclude='cache/' \
  "$ORIGEM" "$DESTINO" >> "$LOG" 2>&1

if [ $? -eq 0 ]; then
    echo "Backup concluído com sucesso em $(date)" >> "$LOG"
else
    echo "ERRO no backup em $(date)" >> "$LOG"
    mail -s "Falha no backup" admin@exemplo.com < "$LOG"
fi

Script de deploy usando SCP com verificação de sucesso:

#!/bin/bash
ARQUIVO="app_v2.1.tar.gz"
SERVIDOR="usuario@servidor"
DESTINO="/opt/app/"

echo "Enviando $ARQUIVO para $SERVIDOR..."
scp "$ARQUIVO" "$SERVIDOR:$DESTINO"

if [ $? -eq 0 ]; then
    echo "Arquivo transferido. Executando deploy remoto..."
    ssh "$SERVIDOR" "cd $DESTINO && tar -xzf $ARQUIVO && ./deploy.sh"
else
    echo "Falha na transferência do $ARQUIVO" >&2
    exit 1
fi

Combinando rsync com tar para backup compactado:

#!/bin/bash
tar czf /tmp/backup_$(date +%Y%m%d).tar.gz /dados/importantes/
rsync -avz /tmp/backup_*.tar.gz usuario@servidor:/backup/
rm -f /tmp/backup_*.tar.gz

Usando find com rsync para backup seletivo:

#!/bin/bash
find /logs/ -name "*.log" -mtime -7 -exec rsync -avz {} usuario@servidor:/backup/logs/ \;

Estes exemplos demonstram como SCP e rsync se integram naturalmente com outras ferramentas Unix, permitindo automações poderosas e seguras para administração de sistemas.

Referências