RDP Monster

Comando scp no Linux: copiar ficheiros de e para um VPS

Comando scp no Linux: copiar ficheiros de e para um VPS

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

TarefaMelhor ferramentaPorquê
Um ficheiro, uma vezscpComando mais curto, nada para instalar
Um diretório, primeira cópiascp -r ou rsync -aResultado equivalente
Implementações ou cópias de segurança repetidasrsyncSó os dados alterados são enviados
Espelho com eliminaçõesrsync --deleteO scp não consegue remover ficheiros
Retomar um ficheiro grandersync -P ou o reget do sftpO scp recomeça do zero
Navegar e depois escolher ficheirossftp ou WinSCPListagem interativa
Milhares de ficheiros pequenosrsync ou tar sobre sshA sobrecarga por ficheiro domina no scp
Windows sem WSLscp no PowerShell ou WinSCPSem 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 o top mostrar o sshd a 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.com usa as instruções AES presentes em quase todos os CPU modernos.
  • Proteja as transferências longas. Execute-as dentro do tmux ou do screen para que uma sessão perdida não mate a cópia, ou use rsync -P e volte a executar.
  • Verifique e limite o débito. O sha256sum file nos dois lados deve coincidir; o scp -l ou o rsync --bwlimit impedem 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?

O scp não foi removido, mas desde o OpenSSH 9.0 transfere através do protocolo SFTP porque o protocolo scp original foi declarado ultrapassado.
Os programadores do OpenSSH descreveram o protocolo scp/rcp original como ultrapassado e difícil de proteger e, a partir do OpenSSH 9.0 (2022), o comando 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?

Sim, se o servidor ainda permitir autenticação por palavra-passe; o scp pede-a exatamente como o ssh.
O scp usa a autenticação que o ssh usaria para esse anfitrião. Se o sshd tiver 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?

Sim: tanto o scp como o rsync substituem ficheiros no destino em silêncio, por isso pré-visualize com rsync --dry-run na dúvida.
O scp substitui qualquer ficheiro existente com o mesmo nome no destino, sem aviso e sem opção para ignorar. O rsync também substitui, mas apenas quando a origem difere, e dá-lhe controlo: -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?

Execute o rsync ou o scp num dos servidores apontando para o outro, ou use scp -3 para encaminhar a cópia pela sua própria máquina.
O caminho mais rápido é de servidor para servidor: ligue-se por ssh ao VPS de origem e execute 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.

Cadastre-se no nosso programa de revendedor

Seus dados

Se tiver alguma dúvida, fale com a gente clicando aqui !
Nome(Obrigatório)
Digite seu endereço de e-mail, você precisa ter uma conta em dashboard.rdp.monster !

Sua empresa

Digite o endereço do seu site, se tiver um
Explique rapidamente como você vai vender os serviços aos seus clientes. Por exemplo, conversando com pessoas em fóruns.

Até os monstros adoram cookies!

Usamos cookies para melhorar sua experiência de navegação, exibir anúncios ou conteúdo personalizados e analisar nosso tráfego. Ao clicar em “Aceitar”, você concorda com o nosso uso de cookies.