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
- OpenBSD SCP Manual — Documentação oficial do comando SCP, com todas as opções e exemplos de uso.
- rsync man page — Manual completo do rsync, incluindo opções avançadas e filtros de exclusão.
- SSH Keys Management - DigitalOcean — Tutorial prático sobre configuração de chaves SSH para autenticação segura.
- Using rsync for Backups - Tecmint — Guia com 20 exemplos práticos de rsync para backups e sincronização.
- SCP vs rsync Performance Comparison — Artigo da Red Hat comparando desempenho e casos de uso entre SCP e rsync.
- Bash Scripting Guide - Advanced Bash-Scripting Guide — Referência completa para criação de scripts Bash avançados com automação de tarefas.