Comando scp: uso e opções, copiar pastas e definir a porta
O scp é a ferramenta de cópia usada para trocar arquivos com um servidor ao qual você se conecta por SSH. Ao enviar um arquivo com o comando scp, você escreve primeiro a origem e depois o destino, como no cp. Ao enviarmos arquivos e pastas de um servidor AlmaLinux 9 para um servidor Debian 12 e trazê-los de volta, a transferência foi feita pelo protocolo SFTP e um arquivo de 20MB chegou em menos de 1 segundo.
Toda a saída abaixo é o resultado exato do scp do OpenSSH 9.9 executado com a conta root no lado emissor. Apenas os endereços de servidor e os nomes de conta foram trocados por valores de exemplo.
1️⃣ Uso do scp e caminhos remotos
Antes de um caminho no servidor remoto, coloque [conta@endereço do servidor:]. Um caminho sem dois-pontos é entendido como um caminho do servidor onde você executou o comando, então o lado com os dois-pontos define se é envio ou recebimento.
Envia report.txt da pasta atual para a pasta scp-test dentro da home do servidor remoto.
scp report.txt user@203.0.113.10:~/scp-test/report.txt 100% 14 5.1KB/s 00:00Ao terminar a transferência, o nome do arquivo, o progresso, o tamanho, a velocidade e o tempo gasto aparecem em uma linha. Este indicador de progresso só aparece quando se executa em um terminal. Por isso, se você redirecionar a saída para um arquivo, nada fica nesse arquivo.
Para receber, escreva primeiro o caminho remoto e depois o caminho local onde salvar.
scp user@203.0.113.10:~/scp-test/report.txt ./downloads/report.txt 100% 14 2.7KB/s 00:00Se o caminho de destino terminar em um nome de arquivo e não em uma pasta, o arquivo é salvo com esse nome. Depois de enviar com o comando abaixo, report.txt ficou na pasta do lado receptor com o nome report-1028.txt.
scp report.txt user@203.0.113.10:~/scp-test/report-1028.txtreport.txt 100% 14 4.6KB/s 00:00🔲 Simulador do comando scp
No simulador abaixo, você pode digitar comandos de envio, recebimento e cópia de pastas e conferir a saída de cada opção.
2️⃣ Opções do comando scp
As opções vão logo depois de scp, antes da origem. -P, que define a porta, é maiúscula, e -p minúscula preserva horários e permissões, então trocar a caixa executa outra ação.
-l define o limite de velocidade de transferência em Kbit/s. Sem opções, um arquivo de 20MB terminou de ser transferido em menos de 1 segundo.
scp backup.tar.gz user@203.0.113.10:~/scp-test/backup.tar.gz 100% 20MB 53.6MB/s 00:00-l 8000 equivale a cerca de 1,000KB por segundo. Ao enviar o mesmo arquivo com -l 8000, o indicador de progresso mostrou 996.5KB/s e a transferência levou 20 segundos.
scp -l 8000 backup.tar.gz user@203.0.113.10:~/scp-test/backup-l.tar.gzbackup.tar.gz 100% 20MB 996.5KB/s 00:20-C comprime os dados na conexão SSH do mesmo modo que o gzip. Ao enviar três vezes um arquivo de log de 19MB com frases repetidas, entre estes dois servidores os envios com -C foram um pouco mais lentos.
| Comando | Arquivo | Tempo de execução | Velocidade no indicador de progresso |
|---|---|---|---|
| scp backup.tar.gz | 20MB | 0,68 s | 53.6MB/s |
| scp -l 8000 backup.tar.gz | 20MB | 20.82 s | 996.5KB/s |
| scp access.log (3 vezes) | 19MB | 0.79~0.89 s | — |
| scp -C access.log (3 vezes) | 19MB | 0.84~0.97 s | — |
O tempo de execução vai do início do comando até a conexão e o fim da transferência. O manual do ssh também explica que a compressão ajuda em linhas lentas e atrasa a transferência em redes rápidas.
-v mostra o processo da conexão à transferência em linhas debug1, então serve para achar a causa quando a conexão falha ou para na autenticação. Como a saída é longa, selecionamos com grep apenas as linhas de autenticação e transferência.
scp -v report.txt user@203.0.113.10:~/scp-test/ 2>&1 | grep -E 'Authenticated|Sending|Transferred'Authenticated to 203.0.113.10 ([203.0.113.10]:22) using "publickey".
debug1: Sending subsystem: sftp
Transferred: sent 2536, received 3248 bytes, in 0.1 secondsA linha [Sending subsystem: sftp] significa que o scp enviou o arquivo pelo protocolo SFTP. A partir do OpenSSH 9.0, o scp usa SFTP por padrão. Com -O, a transferência usa o antigo protocolo SCP e [Sending command: scp -v -t] aparece no mesmo lugar.
scp -O -v report.txt user@203.0.113.10:~/scp-test/ 2>&1 | grep -E 'Authenticated|Sending|Transferred'Authenticated to 203.0.113.10 ([203.0.113.10]:22) using "publickey".
debug1: Sending command: scp -v -t ~/scp-test/
Sending file modes: C0600 14 report.txt
Transferred: sent 2328, received 3036 bytes, in 0.1 seconds📌 Principais opções: resultados deste artigo
| Opção | Tarefa | Resultado neste artigo | |
|---|---|---|---|
| -P | Define a porta de conexão SSH | Porta 22 concluiu o envio de report.txt; a porta fechada 2222 terminou com [Connection timed out] | |
| -i | Define o arquivo de chave privada para a autenticação por chave pública | Envio de report.txt concluído definindo ~/.ssh/id_ed25519 | |
| -r | Copia os arquivos e subpastas da pasta | As pastas css e images ficam no lado receptor com a estrutura original; sem a opção, o erro [not a regular file] impede a transferência | |
| -p | Preserva o horário de modificação, o de acesso e as permissões da origem | Horário de modificação preservado; no lado receptor deste artigo, a permissão 600 só foi mantida no arquivo enviado com -O -p | |
| -C | Comprime os dados na conexão SSH | No log de 19MB entre os dois servidores deste artigo, o envio com a opção foi um pouco mais lento | |
| -l | Define o limite de velocidade de transferência em Kbit/s | Com -l 8000, 20MB a 996.5KB/s em 20.82 segundos | |
| -v | Mostra o processo da conexão à transferência em linhas debug1 | Transferência SFTP confirmada pela linha [Sending subsystem: sftp] | |
| -3 | Transfere os dados entre dois servidores remotos passando pelo servidor que executa o comando (padrão desde o OpenSSH 8.7) | Envio de report.txt concluído com duas pastas do mesmo servidor como origem e destino | |
| -O | Transfere pelo antigo protocolo SCP | [Sending command: scp -v -t] aparece na saída de -v; caminhos com espaços precisam de mais uma barra invertida | |
| -o | Passa ao ssh uma opção no formato ssh_config | Espera definida em 10 segundos com ConnectTimeout=10 e [Connection timed out] confirmado |
📎 Outras opções: segundo o manual oficial
| Opção | Tarefa | |
|---|---|---|
| -q | Desativa o indicador de progresso e os avisos e mensagens de diagnóstico do ssh | |
| -J | Conecta-se primeiro a um host de salto e de lá configura o encaminhamento TCP até o destino final (forma abreviada da configuração ProxyJump; separe vários saltos com vírgulas) | |
| -F | Define outro arquivo como arquivo de configuração por usuário do ssh (passado diretamente ao ssh) | |
| -4 | Força o uso apenas de endereços IPv4 | |
| -6 | Força o uso apenas de endereços IPv6 |
3️⃣ Copiar pastas com scp e preservar horários
Se você indicar uma pasta sem opções, o scp mostra um erro dizendo que não é um arquivo comum e não faz a transferência.
scp site-files user@203.0.113.10:~/scp-test/scp: local "site-files" is not a regular file
scp: failed to upload file site-files to ~/scp-test/Com -r, os arquivos e subpastas da pasta são copiados.
scp -r site-files user@203.0.113.10:~/scp-test/logo.png 100% 48KB 4.7MB/s 00:00
style.css 100% 15 5.0KB/s 00:00
index.html 100% 15 5.2KB/s 00:00A saída mostra apenas nomes de arquivos. Na saída do find no lado receptor, as pastas css e images estavam em site-files com a estrutura original.
ssh user@203.0.113.10 'cd ~/scp-test && find site-files'site-files
site-files/images
site-files/images/logo.png
site-files/index.html
site-files/css
site-files/css/style.css-r segue os links simbólicos da pasta e copia os arquivos originais, então para pastas em que os links devem continuar sendo links, use rsync -a.
-p preserva o horário de modificação, o de acesso e as permissões da origem. Antes de enviar, ajustamos o report.txt original para o horário de modificação 1º de outubro de 2026 00:00 (UTC) e as permissões 600. Como o fuso horário do servidor receptor é UTC, o ls do lado emissor também foi executado com TZ=UTC.
TZ=UTC ls -l report.txt-rw------- 1 root root 14 Oct 1 00:00 report.txtscp -p report.txt user@203.0.113.10:~/scp-test/report-p.txtreport.txt 100% 14 4.7KB/s 00:00scp -O -p report.txt user@203.0.113.10:~/scp-test/report-Op.txtreport.txt 100% 14 4.2KB/s 00:00ssh user@203.0.113.10 'ls -l ~/scp-test/report.txt ~/scp-test/report-p.txt ~/scp-test/report-Op.txt'-rw------- 1 user user 14 Oct 1 00:00 /home/user/scp-test/report-Op.txt
-rw-rw-r-- 1 user user 14 Oct 1 00:00 /home/user/scp-test/report-p.txt
-rw-rw-r-- 1 user user 14 Oct 28 06:17 /home/user/scp-test/report.txtreport-p.txt, enviado com -p, e report-Op.txt, enviado com -O -p, mantiveram o horário original, e report.txt, enviado sem opções, foi salvo com o horário do envio. No servidor receptor, os arquivos enviados por SFTP ficaram com permissões 664 mesmo com -p, e só o arquivo enviado pelo antigo protocolo SCP (-O) manteve 600.
Por isso, nos arquivos cujas permissões precisam ser iguais às da origem, confira as permissões com ls -l no lado receptor depois de enviar.
4️⃣ Definir porta e arquivo de chave no scp
Em servidores que não aceitam conexão com a porta 22 e a chave padrão, defina a porta e a chave antes de enviar. -P define a porta de conexão SSH e -i define o arquivo de chave privada para a autenticação por chave pública.
Abaixo está um exemplo que define diretamente a porta 22 e um arquivo de chave. Em um servidor com a porta alterada, escreva esse número no lugar de 22.
scp -P 22 -i ~/.ssh/id_ed25519 report.txt user@203.0.113.10:~/scp-test/report.txt 100% 14 5.3KB/s 00:00Sem -i, assim como o ssh, ele usa em ordem as chaves com nomes padrão em ~/.ssh (id_rsa, id_ecdsa, id_ed25519 etc.).
Se você envia com frequência para o mesmo servidor, escreva um alias em ~/.ssh/config e digite no scp apenas o alias.
Host myserver
HostName 203.0.113.10
User user
Port 22
IdentityFile ~/.ssh/id_ed25519O nome da linha Host vira o alias, e as quatro linhas abaixo substituem o endereço do servidor, a conta, a porta e o arquivo de chave. O comando só com o alias terminou com o mesmo resultado de uma linha de quando escrevemos o endereço e a chave completos.
scp report.txt myserver:~/scp-test/report.txt 100% 14 4.2KB/s 00:00-P, -i e os alias usam as configurações de conexão do ssh como estão, então o processo de criar uma chave e registrá-la no servidor também é igual ao da conexão com o comando SSH.
5️⃣ Cópia entre servidores com scp
Mesmo quando origem e destino são servidores remotos, uma linha de scp basta para copiar. A partir do OpenSSH 8.7, os dados são transferidos pelo servidor que executa o comando, e esse método é o -3. As notas de versão oficiais citam como motivo da mudança do padrão não ser preciso deixar as credenciais do servidor de destino no servidor de origem.
A medição abaixo foi feita com duas pastas do mesmo servidor como origem e destino. Se o servidor de destino for outro, troque apenas a conta e o endereço do final.
scp -3 user@203.0.113.10:~/scp-test/report.txt user@203.0.113.10:~/scp-test/copy3/report.txt 100% 14 2.5KB/s 00:00É como a matriz receber os documentos entre duas filiais e reenviá-los.
O método antigo, em que o servidor de origem envia diretamente ao servidor de destino, é definido com -R. Esse método exige que o servidor de origem consiga se conectar ao de destino sem senha. A partir do OpenSSH 10.6, usar -R mostra um aviso de descontinuação, e versões futuras devem ignorar essa opção e copiar com o método -3.
6️⃣ Comparação entre scp e rsync
Para enviar alguns arquivos uma vez, o scp basta; para sincronizar várias vezes a mesma pasta ou retomar uma transferência interrompida, use o comando rsync. O scp reenvia todos os arquivos indicados a cada execução, enquanto o rsync compara origem e destino e transfere apenas os arquivos alterados.
| Item | scp | rsync |
|---|---|---|
| Escopo da transferência | Todos os arquivos indicados a cada execução | Apenas arquivos alterados em relação à origem |
| Manter arquivos recebidos pela metade (--partial) | ❌ | ✅ |
| Excluir arquivos que não estão na origem (--delete) | ❌ | ✅ |
| Links simbólicos | Segue e copia os arquivos originais | Com -a, mantém os links |
| Necessário no lado receptor | Acesso SSH e servidor SFTP | rsync instalado nos dois lados |
7️⃣ Mensagens de erro do comando scp e soluções
Quando o scp falha, a causa aparece direto na primeira linha da saída. Nos três casos em que provocamos erros de propósito com arquivo inexistente, permissão de escrita e porta errada, a causa apareceu na primeira linha, e o código de saída nunca foi 0.
🔲 No such file or directory
Se você tentar receber um arquivo que não existe no lado remoto, [No such file or directory] é mostrado com o caminho.
scp user@203.0.113.10:~/scp-test/nofile.txt ./downloads/scp: ~/scp-test/nofile.txt: No such file or directoryAo enviar, se a pasta de destino não existir, ocorre o mesmo erro. O scp não cria pastas ausentes, então execute antes mkdir -p pelo ssh para criar a pasta.
scp report.txt user@203.0.113.10:~/scp-test/nodir/sub/scp: dest open "scp-test/nodir/sub/": No such file or directory
scp: failed to upload file report.txt to ~/scp-test/nodir/sub/🔲 Permission denied
Se a pasta do lado receptor não tiver permissão de escrita, [Permission denied] vem depois de [dest open]. Abaixo está o resultado do envio para uma pasta readonly com permissões 555.
scp report.txt user@203.0.113.10:~/scp-test/readonly/scp: dest open "scp-test/readonly/report.txt": Permission denied
scp: failed to upload file report.txt to ~/scp-test/readonly/Se [conta@endereço do servidor:] vier antes de [Permission denied] e houver um método de autenticação como publickey entre parênteses, a conexão foi recusada na etapa de autenticação. Esse texto é o formato que o programa ssh usa quando a autenticação falha, então confira primeiro o arquivo de chave definido com -i e a chave pública registrada no servidor.
🔲 Connection timed out
Se o número da porta estiver errado ou um firewall bloquear essa porta e não houver resposta, o scp espera a conexão e termina com [Connection timed out]. Abaixo está o resultado do envio para a porta fechada 2222 com espera de 10 segundos.
scp -P 2222 -o ConnectTimeout=10 report.txt user@203.0.113.10:~/scp-test/ssh: connect to host 203.0.113.10 port 2222: Connection timed out
scp: Connection closedSe esse erro aparecer, confira primeiro se o número escrito em -P é igual à porta SSH do servidor.
🔲 Espaços e til (~) nos caminhos
No scp atual, que transfere por SFTP, basta colocar uma vez entre aspas simples o caminho remoto com espaços.
scp report.txt 'user@203.0.113.10:~/scp-test/my files/'report.txt 100% 14 4.7KB/s 00:00Ao adicionar -O ao mesmo comando para enviar pelo antigo protocolo SCP, houve falha com [ambiguous target]. Isso acontece porque, no antigo protocolo SCP, o shell remoto interpreta o caminho mais uma vez.
scp -O report.txt 'user@203.0.113.10:~/scp-test/my files/'scp: ambiguous targetNesse caso, coloque uma barra invertida antes do espaço para que o shell remoto também leia tudo como uma só palavra.
scp -O report.txt 'user@203.0.113.10:~/scp-test/my\ files/'report.txt 100% 14 4.5KB/s 00:00Se o caminho depois dos dois-pontos começar sem barra nem til, ele é tratado a partir da pasta home da conta remota.
scp report.txt user@203.0.113.10:scp-test/report-rel.txtreport.txt 100% 14 5.6KB/s 00:00O manual oficial orienta usar -O quando um servidor SFTP antigo não consegue converter em pasta home um caminho que começa com til. Nesse caso, escrever o caminho a partir da home sem o til, como acima, também salva no mesmo lugar.
🔢 FAQ & conteúdo recomendado











ℹ️ Aviso de afiliados
O conteúdo deste site contém links de afiliados. Quando um visitante compra um produto ou serviço por meio de um desses links, o site recebe uma comissão do vendedor. O valor que o comprador paga (em promoções, ele diminui ↓) não aumenta por causa disso. Preços, descontos e informações de estoque valem para o momento em que o texto foi escrito e podem ter mudado, por isso confirme com o vendedor antes de comprar. Os produtos são escolhidos e avaliados por critérios próprios, e o recebimento de comissão não influencia a ordem de apresentação nem o conteúdo das avaliações.