Como copiar arquivos entre VPS com SCP e Rsync — guia prático
Aprenda a copiar arquivos entre VPS, da máquina local ou entre servidores remotos usando SCP e Rsync com exemplos práticos e flags úteis.
Transferir arquivos entre servidores via terminal é uma das operações mais comuns no dia a dia de quem administra uma VPS. Seja pra subir código em produção, mover backups entre regiões ou migrar dados entre máquinas, SCP e Rsync são as ferramentas padrão — ambas rodam sobre SSH e não exigem instalação de daemon extra na maioria dos casos.
A escolha entre as duas raramente é “qual é melhor” e mais frequentemente “qual encaixa no cenário”. SCP brilha em transferências pontuais simples, geralmente um arquivo ou diretório pequeno copiado uma vez. Rsync brilha em qualquer coisa recorrente, em volumes grandes ou onde a rede pode falhar e você precisa retomar.
Este guia mostra os comandos exatos pra três cenários: local → VPS, VPS → local e VPS → VPS. Tempo estimado de leitura e execução dos exemplos: 15-20 minutos.
Pré-requisitos
Você precisa de acesso SSH funcional pra ambas as máquinas envolvidas. Se ainda não configurou chaves SSH, recomendo fazer isso antes — copiar arquivos digitando senha a cada conexão fica inviável rápido. Os exemplos assumem Linux ou macOS no cliente; no Windows, use WSL2 ou PowerShell com OpenSSH habilitado.
Dados técnicos típicos pra preencher nos comandos:
root ou seu usuário sudo 22 (padrão) IP ou hostname da VPS Confirme acesso básico antes de tentar transferir:
ssh [email protected]
Se o login funciona sem solicitar senha (ou pede só a passphrase da chave), você está pronto.
Copiando com SCP — sintaxe básica
SCP segue o padrão scp [opções] origem destino. Origem ou destino
podem ser locais (caminho normal) ou remotos (usuario@host:caminho).
Copie um arquivo local pra VPS:
scp ./backup.tar.gz [email protected]:/var/backups/O ./backup.tar.gz é o arquivo local. O destino remoto é o diretório
/var/backups/ na VPS. A barra final no destino é importante — sem
ela, o arquivo seria renomeado pra backups.
Copie um diretório inteiro recursivamente:
scp -r ./meu-projeto [email protected]:/var/www/A flag -r ativa modo recursivo. Sem ela, SCP recusa diretórios. O
diretório meu-projeto será criado dentro de /var/www/ no destino.
Baixe um arquivo da VPS pra máquina local:
scp [email protected]:/var/log/nginx/access.log ./A direção é definida pela ordem dos argumentos. O ./ indica o
diretório atual no cliente.
Copie diretamente entre duas VPS usando a flag -3:
scp -3 [email protected]:/data/db.sql [email protected]:/tmp/Sem -3, SCP tenta estabelecer SSH entre as duas VPS, o que exige que
elas tenham chaves cadastradas uma na outra. Com -3, os dados passam
pelo seu cliente local atuando como roteador — mais lento, mas
funciona sem configuração extra.
Flags SCP úteis no dia a dia
-P 2222— especifica porta SSH (P maiúsculo no SCP, diferente do-pminúsculo do SSH)-p(minúsculo) — preserva timestamps e modos do arquivo original-q— modo silencioso, suprime barra de progresso (útil em scripts)-l 5000— limita banda em kbit/s, evita saturar o link da VPS-i ~/.ssh/chave_especifica— usa uma chave SSH específica em vez do padrão
A partir do OpenSSH 9.0, o protocolo SCP usa SFTP por baixo dos panos por questões de segurança. Os comandos continuam funcionando identicamente, mas se ver mensagens sobre “protocolo legado”, saiba que não é erro — é informativo. Pra novas integrações, considere SFTP ou Rsync.
Copiando com Rsync — eficiência em volume
Rsync usa um algoritmo de diff que compara origem e destino bloco a bloco. Em uma sincronização repetida, transfere apenas o que mudou — ganho enorme em diretórios grandes.
Sincronize um diretório local pra VPS:
rsync -avz ./site/ [email protected]:/var/www/site/As flags significam:
-a(archive): preserva permissões, donos, timestamps, links simbólicos, recursivo-v(verbose): mostra arquivos sendo transferidos-z(compress): comprime dados em trânsito, reduz banda em ~30-60% pra arquivos texto
Atenção à barra final na origem: ./site/ copia o conteúdo do
diretório. Sem a barra (./site), copiaria o próprio diretório site
pra dentro do destino, criando /var/www/site/site/.
Adicione barra de progresso e retomada automática:
rsync -avzP ./backup.tar.gz [email protected]:/backups/A flag -P é atalho pra --partial --progress. Mostra velocidade,
ETA e mantém arquivos parciais em caso de interrupção — basta rodar o
mesmo comando novamente pra retomar.
Exclua diretórios desnecessários:
rsync -avzP \
--exclude='node_modules' \
--exclude='.git' \
--exclude='*.log' \
./projeto/ [email protected]:/var/www/projeto/Cada --exclude aceita padrões glob. Você pode também usar
--exclude-from=arquivo.txt pra carregar uma lista de uma vez.
Sincronize entre duas VPS rodando o comando dentro de uma delas:
ssh [email protected] \
"rsync -avzP /data/ [email protected]:/data/"Aqui o Rsync roda dentro da vps1, evitando o gargalo de passar pelo seu cliente. Exige que vps1 tenha chave SSH cadastrada na vps2.
Adicione --dry-run (ou -n) pra simular a operação sem transferir
nada. Combina bem com -v pra ver exatamente o que seria copiado e
deletado. Essencial antes de usar --delete, que apaga no destino
arquivos que não existem na origem.
Flags Rsync que economizam tempo
| Flag | O que faz |
|---|---|
--delete | Apaga no destino arquivos que sumiram da origem — sincronização real |
--bwlimit=5000 | Limita banda em KB/s |
--checksum | Compara via checksum (mais lento, mais seguro que timestamp) |
-e "ssh -p 2222" | SSH em porta não-padrão |
--numeric-ids | Preserva uid/gid numericamente, útil em backups |
--append-verify | Retoma arquivo parcial validando checksum dos blocos já enviados |
Verificação após a transferência
Confirmar que os arquivos chegaram íntegros é parte do processo. Compare contagem e checksum.
Conte arquivos em origem e destino:
# Local
find ./projeto -type f | wc -l
# Remoto
ssh [email protected] "find /var/www/projeto -type f | wc -l"Os números devem bater exatamente, descontando exclusões aplicadas.
Compare checksum de arquivo crítico:
# Local
sha256sum backup.tar.gz
# Remoto
ssh [email protected] "sha256sum /backups/backup.tar.gz"Hashes idênticos confirmam integridade bit a bit.
Resolução de problemas
Permission denied (publickey)
Sua chave SSH não está sendo aceita. Verifique se a chave pública está
em ~/.ssh/authorized_keys no servidor e se as permissões estão
corretas (700 no diretório .ssh, 600 no arquivo). Teste com
ssh -v usuario@host pra ver o handshake completo e identificar qual
chave foi oferecida.
No space left on device
Destino sem espaço. Verifique com df -h no servidor e libere antes
de tentar novamente. Rsync com --partial mantém o arquivo parcial,
então retomar funciona depois que você libera espaço.
Connection timed out durante transferência longa
Conexão SSH expirou. Adicione ServerAliveInterval 60 no seu
~/.ssh/config ou use rsync -e "ssh -o ServerAliveInterval=60" pra
mandar keepalives. Em transferências de horas, isso evita que NAT
intermediário derrube a sessão.
Próximos passos
Com SCP e Rsync dominados, você cobre 90% das transferências do dia a dia. Pra ir adiante:
- Configure chaves SSH com passphrase + agente SSH pra produtividade
- Automatize backups com Rsync via cron, escrevendo no
/etc/cron.d/ - Explore
rsnapshotpra backups incrementais com hardlinks - Considere SSHFS pra montar diretórios remotos como filesystem local
- Pra transferências entre regiões geográficas distantes, avalie
ferramentas como
bbcpoumbufferque paralelizam streams
Se você está colocando isso em produção, uma VPS Hostini já vem com SSH endurecido por padrão e link de rede dimensionado pra sustentar transferências sustentadas sem throttle — útil tanto pra deploy quanto pra backups recorrentes.
Perguntas frequentes
Qual a diferença prática entre SCP e Rsync?
SCP copia tudo de uma vez sem comparar o destino — simples, mas reenvia o arquivo inteiro se você rodar de novo. Rsync compara origem e destino bloco a bloco, transfere só o diff e suporta retomada. Pra arquivos pequenos e únicos, SCP é mais rápido de digitar. Pra diretórios grandes ou sincronização recorrente, Rsync ganha sempre.
Posso copiar arquivos de uma VPS direto pra outra sem passar pelo meu computador?
Sim. Tanto SCP quanto Rsync aceitam origem e destino remotos na mesma linha, ex: `scp user1@vps1:/path/file user2@vps2:/path/`. O cliente local atua como intermediário de controle, mas os dados podem trafegar diretamente se você usar `-3` no SCP ou rodar o comando dentro de uma das VPS via SSH.
Como retomar uma transferência Rsync interrompida?
Use as flags `--partial --append-verify`. O `--partial` mantém o arquivo parcial no destino, e o `--append-verify` retoma de onde parou validando o checksum dos blocos já enviados. Combinado com `-P` (que é `--partial --progress`), você tem retomada e barra de progresso.
É seguro copiar com a flag --exclude pra ignorar pastas grandes?
Sim, e é recomendado. Sempre exclua `node_modules`, `vendor`, `.git`, `*.log` e caches que podem ser reconstruídos no destino. Exemplo: `rsync -avz --exclude='node_modules' --exclude='.git' src/ dest/`. Reduz drasticamente o volume transferido sem perder integridade do projeto.
Por que minha transferência SCP está extremamente lenta?
SCP usa cifra AES-128-CTR por padrão, que é segura mas custosa em CPU. Em VPS com link rápido e CPU limitada, o gargalo vira a criptografia. Teste `scp -c [email protected]` ou troque pra Rsync sobre SSH, que tem compressão (`-z`) e protocolo mais eficiente em arquivos múltiplos.
Como copiar arquivos preservando permissões e donos?
No SCP, use a flag `-p` pra preservar timestamps e modos. No Rsync, use `-a` (modo arquivo), que já inclui preservação de permissões, donos, grupos, timestamps e links simbólicos. Pra preservar uid/gid numericamente em vez de mapear por nome, adicione `--numeric-ids` no Rsync.