Comando scp no Linux: copiar ficheiros de e para um VPS
- 14 de novembro de 2026
- 09:00
- Por Adrien Roche
- Tutoriais

O comando scp no Linux: sintaxe e as transferências básicas
O scp (secure copy) copia ficheiros entre máquinas através de SSH, por isso o utilizador, a chave e a porta que funcionam com ssh funcionam com scp. A forma é sempre scp [options] SOURCE DESTINATION, e o lado remoto escreve-se user@host:path. Precisa de um início de sessão SSH funcional; se a porta 22 ainda não responder, ative o SSH no Ubuntu e reforce-o primeiro.
1. Do local para o remoto (envio)
scp backup.tar.gz user@SERVER_IP:/home/user/
scp backup.tar.gz user@SERVER_IP:~/backups/renamed.tar.gz
scp *.conf user@SERVER_IP:~/nginx-conf/
Um caminho terminado em barra coloca o ficheiro dentro desse diretório com o nome original; um caminho completo renomeia-o à chegada. Vários ficheiros locais podem preceder o destino desde que o destino seja um diretório, e esse diretório tem de já existir: o scp não cria diretórios-pai.
2. Do remoto para o local (transferência)
scp user@SERVER_IP:/var/log/nginx/access.log .
scp user@SERVER_IP:'/var/log/nginx/*.log' ./logs/
O ponto significa "aqui, com o mesmo nome". Coloque entre aspas os wildcards remotos para que a sua shell local não os expanda. Também funciona de remoto para remoto: scp -3 user@HOST_A:/data/dump.sql user@HOST_B:/data/ encaminha a cópia pela sua máquina, por isso só a sua máquina precisa de credenciais para ambos os servidores.
3. Diretórios com -r
scp -r ./site user@SERVER_IP:/var/www/
scp -r user@SERVER_IP:/etc/nginx ./nginx-backup
O -r copia um diretório e tudo o que está por baixo dele. O primeiro comando cria /var/www/site no servidor; o segundo traz toda a árvore do nginx para uma pasta local. As ligações simbólicas são copiadas como ficheiros normais, uma das razões pelas quais o rsync é a melhor ferramenta para árvores de sistema completas.
Opções do scp que vai mesmo usar: -P, -i, -C, -p
scp -P 2222 file.txt user@SERVER_IP:/home/user/ # non-default SSH port
scp -i ~/.ssh/id_ed25519 file.txt user@SERVER_IP:~/ # use a specific key
scp -C dump.sql user@SERVER_IP:~/ # compress in transit
scp -rp ./site user@SERVER_IP:/var/www/ # keep times and modes
A opção da porta é um -P maiúsculo. O -p minúsculo significa "preservar datas de modificação, de acesso e bits de permissão" e, como o próprio ssh usa -p para a porta, trocá-los é o erro mais comum do scp. Para não repetir a porta e a chave em cada chamada, defina o anfitrião uma vez em ~/.ssh/config; o scp, o rsync e o sftp leem-no todos:
Host vps
HostName SERVER_IP
User user
Port 2222
IdentityFile ~/.ssh/id_ed25519
Mais duas opções: -l 8000 limita a transferência a 8.000 Kbit/s (cerca de 1 MB/s) e -v mostra que chaves são propostas quando a autenticação falha. Desde o OpenSSH 9.0, o scp fala o protocolo SFTP por baixo; a sintaxe não mudou, mas truques de shell embutidos num caminho remoto (substituição de comandos, por exemplo) já não são executados no servidor, e o -O repõe o protocolo antigo para um servidor muito antigo que rejeite o novo modo.
rsync: espelhos, transferências retomáveis e exclusões
O rsync copia apenas o que mudou. A primeira execução comporta-se como scp -r; as seguintes comparam ambos os lados e enviam apenas as diferenças: ficheiros novos e, nos ficheiros alterados, só os blocos modificados. Isso torna-o a ferramenta para implementações, cópias de segurança e tudo o que seja grande. Tem de estar instalado nos dois lados (sudo apt install rsync); algumas imagens mínimas e contentores não o incluem.
1. O comando do dia a dia
rsync -avz --progress ./site/ user@SERVER_IP:/var/www/site/
rsync -avz --progress user@SERVER_IP:/var/www/site/ ./site-backup/
O -a (archive) expande para -rlptgoD: percorrer recursivamente, manter as ligações simbólicas como tal, preservar permissões, datas, grupo, dono e ficheiros de dispositivo; a propriedade só é preservada quando o lado recetor corre como root. O -v lista os ficheiros, o -z comprime e o --progress mostra cada ficheiro.
A barra final importa. ./site/ significa "o conteúdo de site"; ./site significa "o próprio diretório", o que criaria /var/www/site/site. Na dúvida, acrescente -n (--dry-run) e leia a lista de ficheiros antes de escrever seja o que for.
2. Espelhar com --delete
rsync -avzn --delete ./site/ user@SERVER_IP:/var/www/site/ # dry run first
rsync -avz --delete ./site/ user@SERVER_IP:/var/www/site/
O --delete remove no destino os ficheiros que já não existem na origem. Um espelho a sério precisa dele, e é também o que transforma uma barra final errada num diretório apagado, por isso teste cada novo comando com --delete em dry-run uma vez.
3. Excluir ficheiros
rsync -avz --exclude='node_modules/' --exclude='.git/' --exclude='*.log' ./app/ user@SERVER_IP:/srv/app/
rsync -avz --exclude-from='.rsyncignore' ./app/ user@SERVER_IP:/srv/app/
Os padrões são relativos à raiz da transferência; uma barra inicial ancora-os, por isso /config.php exclui apenas o ficheiro de topo. O --exclude-from lê um padrão por linha.
4. Retomar uma transferência parcial, porta e chave personalizadas
rsync -avP -e 'ssh -p 2222 -i ~/.ssh/id_ed25519' ./disk.img user@SERVER_IP:/backup/
O -P é a abreviatura de --partial --progress: se a ligação cair, o ficheiro parcial é mantido e voltar a executar o mesmo comando continua a partir do ponto onde parou. As opções de SSH passam por -e, e aqui a porta é o -p minúsculo porque é a opção do ssh, não do rsync; uma entrada Host em ~/.ssh/config elimina toda a cadeia -e.
sftp: transferências interativas com o mesmo início de sessão SSH
O sftp dá-lhe uma linha de comandos ao estilo FTP sobre SSH, prática para navegar antes de copiar.
sftp -P 2222 -i ~/.ssh/id_ed25519 user@SERVER_IP
sftp> ls -l /var/www
sftp> lcd ~/Downloads
sftp> get /var/log/syslog
sftp> put -r ./site /var/www/
sftp> reget backup.iso
sftp> bye
Os comandos começados por l atuam na sua máquina (lcd, lls, lpwd); os restantes atuam no servidor. O put -r e o get -r copiam diretórios, o reget e o reput retomam um ficheiro interrompido, e !command executa um comando local sem sair da sessão. sftp -b commands.txt user@SERVER_IP reproduz um ficheiro com estes comandos, útil para tarefas do cron.
Copiar ficheiros a partir do Windows: scp no PowerShell e WinSCP
O Windows 10 (1809 e posterior) e o Windows 11 incluem o cliente OpenSSH, por isso o scp, o sftp e o ssh existem no PowerShell com as mesmas opções que no Linux:
cd C:\Users\you\Projects
scp -P 2222 -i $HOME\.ssh\id_ed25519 .\site.zip user@SERVER_IP:/home/user/
scp -r user@SERVER_IP:/var/www/site $HOME\Downloads
As chaves ficam em C:\Users\you\.ssh\, ao lado do known_hosts, e o ssh-keygen -R SERVER_IP também funciona aí. Caminhos relativos depois de um cd evitam qualquer confusão entre uma letra de unidade e um nome de anfitrião. O rsync não está incluído; a forma mais limpa de o obter é o WSL: wsl rsync -avz /mnt/c/Users/you/site/ user@SERVER_IP:/var/www/site/.
Para uma interface gráfica, o WinSCP é a escolha habitual: fala SFTP e SCP, oferece uma vista de dois painéis com arrastar e largar, e o seu comando Synchronize faz aproximadamente o que faz o rsync --delete. Espera chaves no formato .ppk do PuTTY e propõe converter uma chave OpenSSH quando a seleciona. Para tudo o que seja implementado repetidamente, uma linha de scp ou rsync num script é mais fácil de rever e automatizar.
scp vs rsync vs sftp: qual usar
| Tarefa | Melhor ferramenta | Porquê |
|---|---|---|
| Um ficheiro, uma vez | scp | Comando mais curto, nada para instalar |
| Um diretório, primeira cópia | scp -r ou rsync -a | Resultado equivalente |
| Implementações ou cópias de segurança repetidas | rsync | Só os dados alterados são enviados |
| Espelho com eliminações | rsync --delete | O scp não consegue remover ficheiros |
| Retomar um ficheiro grande | rsync -P ou o reget do sftp | O scp recomeça do zero |
| Navegar e depois escolher ficheiros | sftp ou WinSCP | Listagem interativa |
| Milhares de ficheiros pequenos | rsync ou tar sobre ssh | A sobrecarga por ficheiro domina no scp |
| Windows sem WSL | scp no PowerShell ou WinSCP | Sem rsync nativo |
Regra prática: scp quando consegue escrever o comando de memória, rsync assim que o for executar duas vezes.
Dicas de velocidade que fazem mesmo diferença
- A compressão não é gratuita. O
-C(scp) e o-z(rsync) reduzem texto, dumps SQL e registos, mas desperdiçam CPU em tarballs, imagens e vídeo. Se otopmostrar osshda 100% durante uma transferência, retire a opção. - Agrupe muitos ficheiros pequenos. As idas e voltas por ficheiro dominam quando envia uma árvore de código; um único fluxo é mais rápido:
tar czf - ./site | ssh user@SERVER_IP 'tar xzf - -C /var/www/'. - Experimente outra cifra em ligações rápidas. Quando o próprio processo ssh é o estrangulamento, o
scp -c aes128-gcm@openssh.comusa as instruções AES presentes em quase todos os CPU modernos. - Proteja as transferências longas. Execute-as dentro do
tmuxou doscreenpara que uma sessão perdida não mate a cópia, ou usersync -Pe volte a executar. - Verifique e limite o débito. O
sha256sum filenos dois lados deve coincidir; oscp -lou orsync --bwlimitimpedem que uma cópia de segurança asfixie a aplicação.
Permissões, propriedade e erros comuns
Permission denied no caminho de destino
scp: /var/www//html/: Permission denied significa que o início de sessão funcionou mas esse utilizador não pode escrever ali. Copie para a sua pasta pessoal e faça sudo mv dos ficheiros, dê a propriedade do destino ao utilizador (sudo chown -R user:user /var/www/site), ou com o rsync acrescente --rsync-path="sudo rsync", que funciona quando o utilizador de sessão tem sudo sem palavra-passe, como se configura em criar um utilizador com direitos sudo no Linux. Enviar como root evita o erro mas deixa ficheiros pertencentes a root que um servidor web não consegue escrever: faça sudo chown -R www-data:www-data /var/www/site a seguir.
Permission denied (publickey)
O servidor recusou a autenticação. Verifique o nome de utilizador, force a chave com -i, acrescente -v; no VPS, o sudo journalctl -u ssh -n 30 indica o motivo.
Remote host identification has changed
É esperado depois de uma reinstalação ou de uma reatribuição de IP: a chave do anfitrião já não corresponde a ~/.ssh/known_hosts. Se realmente reconstruiu o servidor, execute ssh-keygen -R SERVER_IP e volte a ligar-se. Se não o fez, descubra porquê antes de escrever uma palavra-passe seja onde for.
No such file or directory
O scp não cria diretórios-pai: execute primeiro ssh user@SERVER_IP 'mkdir -p /var/www/site'. O rsync cria apenas o último componente do diretório (o --mkpath, no rsync 3.2.3+, cria os pais).
rsync: command not found, ou protocol data stream (code 12)
O rsync falta num dos lados; faça sudo apt install rsync aí e tente de novo.
Scripts enviados que se recusam a correr
Os ficheiros vindos do Windows não têm o bit de execução e trazem muitas vezes fins de linha CRLF, o que produz bad interpreter: No such file or directory. Corrija ambos com chmod +x deploy.sh e sed -i 's/\r$//' deploy.sh; o lado do shebang está tratado em o que é um ficheiro .sh e como o bash o executa. Um último clássico: scp file.txt user@SERVER_IP sem os dois pontos depois do anfitrião é uma cópia local que cria em silêncio um ficheiro chamado user@SERVER_IP.
Tudo isto pressupõe um servidor a que chega por SSH como root ou como utilizador sudo, onde o limite é a transferência em si e não uma quota. Um VPS Linux da rdp.monster é esse tipo de máquina: acesso root total, CPU e RAM dedicados, largura de banda ilimitada (fair-use), sem KYC, criptomoedas aceites, a partir de $8.99 por mês, e o servidor fica online cerca de 10 segundos após a confirmação do pagamento, para que a primeira coisa que execute nele possa ser o scp do primeiro passo.
Perguntas frequentes
O comando scp está obsoleto?
scp move ficheiros por SFTP. O comando, as suas opções e a sintaxe user@host:path não mudaram, por isso os scripts existentes continuam a funcionar; só a expansão da shell dentro de caminhos remotos se comporta de forma diferente, e o -O repõe o protocolo antigo para os servidores que dele precisem. Para automatização nova, o rsync ou o sftp são as escolhas mais capazes, mas o scp em si serve bem para cópias pontuais.Posso usar o scp com palavra-passe em vez de uma chave SSH?
PasswordAuthentication yes, o scp pede a palavra-passe e a cópia prossegue; não há nenhuma opção para passar a palavra-passe na linha de comandos, e ferramentas como o sshpass, que o fazem, deixam-na no histórico da shell. Os servidores reforçados costumam desativar o início de sessão por palavra-passe, e nesse caso o scp falha com Permission denied (publickey) até instalar uma chave com ssh-copy-id. As chaves são também o que permite aos scripts correr sem supervisão.O scp substitui ficheiros existentes sem perguntar?
-n (--dry-run) imprime o que mudaria, --ignore-existing deixa intactos os ficheiros que já existem, --update ignora os ficheiros mais recentes no destino e --backup --backup-dir=DIR guarda as versões substituídas. Para tudo o que seja insubstituível, copie para um diretório novo e troque-o depois.Como copio ficheiros diretamente entre dois servidores VPS?
rsync -avz /data/ user@OTHER_IP:/data/ (ou scp -r), para que os dados nunca passem pela sua ligação doméstica. Isso exige que o primeiro servidor tenha uma chave que o segundo aceite. Se preferir não colocar chaves nos servidores, scp -3 user@HOST_A:/path user@HOST_B:/path copia através da sua máquina usando apenas as suas credenciais locais, ao custo de descarregar e enviar tudo uma vez cada.Adrien Roche, Editor de infraestrutura e hospedagem
Engenheiro de sistemas com mais de 10 anos cuidando de parques de servidores Windows Server e Linux. Adrien mantém a documentação de infraestrutura do rdp.monster e escreve nossos guias sobre RDP, hospedagem VPS, administração de servidores, redes e ferramentas de privacidade.




