Ubuntu scp e rsync
Com o SSH funcionando, copiar arquivos entre máquinas é um comando só. O scp é o jeito rápido de mandar ou buscar um arquivo. O rsync é o jeito inteligente: copia só o que mudou, retoma cópias interrompidas e é a base de quase todo backup no Linux.
- Como escrever o "de onde" e o "para onde" quando um dos lados é outra máquina.
- Enviar e buscar arquivos e pastas com
scp. - Sincronizar pastas com
rsynce a regra da barra no final da origem. - Usar
--dry-runantes de qualquer--delete, para não apagar o que não devia.
Esta aula supõe que você já entra no servidor com ssh ana@192.168.0.50 (veja SSH). Os dois comandos usam o SSH por baixo: se o ssh funciona, eles também funcionam, com as mesmas chaves e os mesmos apelidos do ~/.ssh/config.
Como escrever um caminho remoto
Os dois comandos seguem a ideia do cp: origem primeiro, destino depois. A novidade é que qualquer um dos lados pode estar em outra máquina. Um caminho remoto tem três partes:
- ana
- O usuário no servidor (pode ser omitido se for igual ao seu).
- @192.168.0.50
- A máquina. Pode ser um apelido do
~/.ssh/config, comoservidor. - :/home/ana/backup
- Os dois-pontos separam a máquina do caminho dentro dela. Sem nada depois dos dois-pontos, vale a pasta pessoal.
| Escrita | Significa |
|---|---|
relatorio.pdf | Arquivo na pasta atual, nesta máquina |
servidor:relatorio.pdf | Arquivo na pasta pessoal, no servidor |
servidor:/var/www/ | A pasta /var/www no servidor |
servidor: | A pasta pessoal no servidor |
scp foto.jpg servidor (sem :) não envia nada: cria uma cópia local chamada servidor. Sempre termine o nome da máquina com :.
scp: copiar como o cp, mas entre máquinas
scp vem de secure copy, "cópia segura".
Enviar um arquivo (notebook → servidor)
- scp
- O programa.
- relatorio.pdf
- Origem: um arquivo do notebook.
- ana@192.168.0.50:/home/ana/
- Destino: uma pasta no servidor.
$ scp relatorio.pdf ana@192.168.0.50:/home/ana/ relatorio.pdf 100% 2355KB 11.2MB/s 00:00 « nome, progresso, tamanho, velocidade, tempo
Buscar um arquivo (servidor → notebook)
Basta inverter a ordem. O . no final significa "aqui, na pasta atual":
$ scp servidor:/var/log/nginx/access.log . access.log 100% 842KB 9.8MB/s 00:00 $ ls access.log
Pastas inteiras: -r
Como no cp, pastas exigem -r (recursivo):
$ scp -r ~/Documentos/projetos/site servidor:/home/ana/ index.html 100% 13 4.1KB/s 00:00 style.css 100% 22 8.0KB/s 00:00
Outra porta: -P maiúsculo
Atenção a esta pegadinha: no ssh a porta é -p (minúsculo); no scp é -P (maiúsculo), porque o -p do scp preserva datas e permissões.
$ scp -P 2222 backup.tar.gz deploy@203.0.113.10:
Opções do scp
| Opção | Faz |
|---|---|
-r | Copia pastas |
-P PORTA | Porta do SSH (maiúsculo!) |
-p | Preserva datas e permissões |
-C | Comprime durante o envio (ajuda em conexões lentas) |
-i CHAVE | Usa uma chave específica |
-q | Silencioso, sem barra de progresso |
rsync: copiar só o que mudou
O scp sempre copia tudo de novo. O rsync (de remote sync, "sincronização remota") compara origem e destino e envia só as diferenças. Na segunda vez que você sincroniza uma pasta de 10 GB onde só um arquivo mudou, ele envia só aquele arquivo.
- rsync
- O programa.
- -a
- archive: recursivo e preserva datas, permissões e links. Use quase sempre.
- -v
- verbose: lista cada arquivo enviado.
- -h
- Tamanhos legíveis (K, M, G).
- fotos/
- Origem. A barra final importa (veja a próxima seção).
- servidor:backup/fotos/
- Destino.
$ rsync -avh fotos/ servidor:backup/fotos/ sending incremental file list praia.jpg 2026/ 2026/festa.jpg sent 4,13M bytes received 70 bytes 2,75M bytes/sec total size is 4,13M speedup is 1,00 $ rsync -avh fotos/ servidor:backup/fotos/ « rodando de novo, sem mudanças sending incremental file list sent 125 bytes received 12 bytes 274,00 bytes/sec total size is 4,13M speedup is 30.153,12 « nada foi enviado: tudo já estava igual
sent e received são os bytes que passaram pela rede. O speedup diz quantas vezes o rsync foi mais eficiente do que copiar tudo de novo.
O rsync também funciona entre duas pastas da mesma máquina, como um cp mais esperto, ótimo para copiar para um HD externo (veja Backup).
A barra no final da origem
Esta é a regra que mais confunde no rsync. Compare, lado a lado, as duas formas copiando a pasta fotos para dentro de backup:
| Comando | Lê-se | Resultado no destino |
|---|---|---|
rsync -av fotos backup/ | "copie a pasta fotos para dentro de backup" | backup/fotos/praia.jpg |
rsync -av fotos/ backup/ | "copie o conteúdo de fotos para dentro de backup" | backup/praia.jpg |
$ rsync -av fotos backup/ sending incremental file list fotos/ « a própria pasta foi criada no destino fotos/praia.jpg fotos/2026/ fotos/2026/festa.jpg … $ rsync -av fotos/ backup/ sending incremental file list praia.jpg « só o conteúdo, sem a pasta fotos 2026/ 2026/festa.jpg …
Escreva a pasta com o mesmo nome dos dois lados e com barra nos dois: rsync -av fotos/ backup/fotos/. Assim o resultado é sempre o esperado. A barra no destino não muda o comportamento; só a da origem.
Espelhar: --delete e --dry-run
Sem opções extras, o rsync só acrescenta e atualiza: o que você apagou na origem continua no destino. Para que o destino fique idêntico (um espelho), use --delete: ele apaga no destino o que não existe mais na origem.
--dry-run antes
Combinado com o erro da barra, o --delete pode apagar um backup inteiro. A opção --dry-run (ou -n) simula tudo e mostra o que seria feito, sem mexer em nada.
Veja o que aconteceria se a Ana usasse --delete depois de ter feito o primeiro rsync da seção anterior, aquele sem barra:
$ rsync -avn --delete fotos/ backup/ sending incremental file list deleting fotos/2026/festa.jpg « apagaria a cópia anterior inteira! deleting fotos/2026/ deleting fotos/praia.jpg deleting fotos/ deleting velho.jpg « e este arquivo, que só existia no backup sent 139 bytes received 101 bytes 480,00 bytes/sec total size is 4 speedup is 0,02 (DRY RUN) « DRY RUN: nada foi feito de verdade
Graças ao -n, nada foi apagado. A Ana percebe o problema e corrige o destino para backup/fotos/ antes de rodar sem o -n.
Simule:
rsync -avn --delete origem/ destino/Leia cada linha
deleting. Se aparecer algo que você quer manter, pare e corrija.Rode de verdade, tirando só o
n:rsync -av --delete origem/ destino/
Arquivos grandes e conexões ruins
Para arquivos grandes, -P junta duas coisas: --progress (barra de progresso por arquivo) e --partial (guarda o pedaço já enviado se a conexão cair). Rodando o mesmo comando de novo, a cópia continua de onde parou:
$ rsync -ahP ubuntu-26.04-desktop-amd64.iso servidor:isos/
sending incremental file list
ubuntu-26.04-desktop-amd64.iso
2,31G 36% 11,42MB/s 0:05:59 « parte enviada, porcentagem, velocidade, tempo restante
Outras opções úteis:
| Opção | Faz | Exemplo |
|---|---|---|
-z | Comprime durante o envio | rsync -avz logs/ servidor:logs/ |
--exclude | Ignora arquivos ou pastas | rsync -av --exclude '*.tmp' --exclude 'cache/' a/ b/ |
-e "ssh -p 2222" | Usa outra porta do SSH | rsync -av -e "ssh -p 2222" a/ vps:a/ |
--bwlimit=5M | Limita a velocidade, para não travar a rede | rsync -av --bwlimit=5M a/ servidor:a/ |
Formas diferentes de copiar entre máquinas
| Forma | Exemplo | Melhor quando… |
|---|---|---|
scp | scp foto.jpg servidor: | Um arquivo ou uma pasta pequena, uma vez só |
rsync | rsync -av pasta/ servidor:pasta/ | Pastas grandes, cópias repetidas, backups |
rsync -P | rsync -ahP grande.iso servidor: | Arquivo enorme ou conexão que cai |
sftp | sftp servidor, depois get e put | Você quer navegar no servidor antes de escolher o que baixar |
| Arquivos (GNOME) | "Outros locais" → sftp://ana@192.168.0.50 | Prefere arrastar e soltar com o mouse |
Quando não funciona
$ scp relatorio.pdf servidro: ssh: Could not resolve hostname servidro: Name or service not known scp: Connection closed
O que aconteceu: o scp não conseguiu abrir a conexão SSH. A primeira linha diz o motivo real; aqui, um erro de digitação no nome.
Como resolver: teste primeiro com ssh servidor. Se o ssh não entra, o scp também não vai entrar; resolva com a aula de SSH.
O que aconteceu: faltou ou sobrou a barra no final da origem do rsync, e a pasta foi criada um nível acima ou abaixo do esperado.
Como resolver: confira no destino com ssh servidor ls -R backup | head, apague a cópia errada e rode de novo com a origem e o destino terminando em barra.
$ rsync -av fotso/ backup/ sending incremental file list rsync: [sender] change_dir "/home/ana/fotso" failed: No such file or directory (2) … rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1356) [sender=3.4.1]
O que aconteceu: a origem não existe; aqui, "fotso" em vez de "fotos". O código 23 indica que parte da transferência falhou. As mensagens do rsync aparecem em inglês.
O que aconteceu: o usuário do SSH não pode escrever na pasta de destino (por exemplo, /var/www, que é do root).
Como resolver: envie para a sua pasta pessoal no servidor e, lá dentro, mova com sudo mv. Ou ajuste o dono da pasta de destino (veja chown, chgrp, umask).
Referência rápida
| Tarefa | Comando |
|---|---|
| Enviar arquivo | scp arq servidor:destino/ |
| Buscar arquivo | scp servidor:caminho/arq . |
| Enviar pasta | scp -r pasta servidor: |
| Sincronizar pasta | rsync -avh pasta/ servidor:pasta/ |
| Simular | rsync -avhn --delete pasta/ servidor:pasta/ |
| Espelhar (apaga extras) | rsync -avh --delete pasta/ servidor:pasta/ |
| Arquivo grande, retomável | rsync -ahP arq servidor: |
| Ignorar arquivos | rsync -av --exclude 'node_modules/' a/ b/ |
Exercícios
1. Buscar do servidor
Complete para trazer /etc/hostname do servidor para a pasta atual:
2. Porta no scp
Complete para enviar usando a porta 2222 do SSH:
3. Simular antes de apagar
Complete para simular um espelhamento com --delete:
4. Depois de rsync -av docs/ backup/, onde fica o arquivo docs/a.txt?
5. Qual é a vantagem principal do rsync sobre o scp num backup diário?
Resumo
- Caminho remoto:
usuario@maquina:caminho; os dois-pontos são obrigatórios. scp: rápido para uma cópia;-rpara pastas; porta com-Pmaiúsculo.rsync -avhcopia só o que mudou;-Pretoma;-zcomprime;--excludeignora.- Barra na origem = copiar o conteúdo; sem barra = copiar a pasta.
- Antes de
--delete, sempre-n(--dry-run) e leia cadadeleting.