06 - SFTP e SCP
video: https://youtu.be/... no frontmatter da nota.SFTP e SCP
1. Definição
SFTP (SSH File Transfer Protocol) e SCP (Secure Copy Protocol) são dois mecanismos distintos de transferência de arquivos sobre SSH. Apesar de ambos usarem a porta 22 e o canal cifrado do SSH, têm arquiteturas, capacidades e históricos completamente diferentes. A confusão entre eles é comum porque ambos copiam arquivos via SSH, mas tecnicamente são protocolos separados.
- SCP: protocolo legado (1983, derivado do
rcpBSD), que executa o binárioscpno servidor para cada transferência. Operações limitadas a cópia de arquivo único. Substituído por SFTP como padrão desde OpenSSH 9.0 (2022). - SFTP: protocolo moderno (2001, Internet-Draft
draft-ietf-secsh-filexfer), executado como subsistema do SSH (Subsystem sftp). Permite navegação de diretórios, operações múltiplas, preservação de atributos e retomada de transferências.
Comparação Rápida
| Característica | SCP | SFTP |
|---|---|---|
| Ano de origem | 1983 (rcp), SSH 1995 | 2001 |
| RFC / Spec | RFC 4251 (arquitetura SSH) | I-D secsh-filexfer |
| Implementação | Binário scp no servidor |
Subsistema sftp-server |
| Operações | Apenas cópia (put/get) |
Lista, rename, mkdir, stat, symlink |
| Navegação remota | Não | Sim (interactive shell) |
| Retomar transferência | Não (recria do zero) | Sim (offset em read/write) |
| Preservar atributos | -p (limitado) |
Sim (perms, uid, gid, timestamps, ACLs) |
| Performance | Menor (1 processo por arquivo) | Maior (1 canal, pipeline) |
| Default em OpenSSH 9.0+ | Não | Sim |
2. SCP — Secure Copy Protocol
O SCP é essencialmente o rcp (remote copy do BSD) encapsulado em SSH. Funciona executando o binário scp no servidor remoto, que por sua vez usa o ssh para transportar dados. Cada transferência cria um novo subsistema SSH.
Funcionamento Interno
O cliente SCP conecta via SSH, solicita execução de scp -t (to, recebimento) ou scp -f (from, envio) no servidor. O protocolo troca mensagens de controle (tipo C0644 tamanho nome) seguidas do conteúdo bruto do arquivo. Não há sessão interativa — cada comando scp é uma operação completa.
Sintaxe Básica
scp /local/arquivo.txt user@host:/remoto/dir/ # Local para remoto
scp user@host:/remoto/arquivo.txt /local/ # Remoto para local
scp user1@host1:/arq user2@host2:/destino/ # Entre hosts remotos
scp -r /local/dir user@host:/remoto/ # Recursivo
scp -p /local/arq user@host:/remoto/ # Preservar perms/timestamps
scp -P 2222 /local/arq user@host:/remoto/ # Porta SSH diferente
scp -C /local/grande.log user@host:/remoto/ # Comprimir em trânsito
scp -l 1000 /local/arq user@host:/remoto/ # Limitar banda (1 Mbps)
Limitações do SCP
- Sem navegação: cada invocação é uma cópia isolada; não há "entrar" no servidor remoto.
- Sem rename/mkdir: precisa de SSH interativo ou SFTP para operações de diretório.
- Sem retomar: transferência interrompida reinicia do zero.
- Baixa performance em múltiplos arquivos: cada arquivo dispara novo handshake SSH interno, sobrecarregando a rede em milhares de arquivos pequenos.
- Sem progresso de resumo: barra de progresso existe, mas não há relatório final de taxa.
- Obsoleto: OpenSSH 9.0 (2022) trocou o protocolo padrão de
scppara usar SFTP internamente (flag-s), mantendo a CLI compatível.
3. SFTP — SSH File Transfer Protocol
O SFTP é um protocolo de transferência de arquivos completo, baseado em mensagens request-response sobre um canal SSH. Permite operações ricas equivalentes a um sistema de arquivos remoto. É o subsistema padrão para transferência segura de arquivos em servidores modernos.
Arquitetura
O cliente SFTP abre uma conexão SSH, solicita o subsistema sftp (Subsystem sftp /usr/lib/openssh/sftp-server no sshd_config), e troca pacotes SFTP binários (versão, extensões, comandos). Múltiplas requisições podem ser pipelineadas em um único canal, evitando o overhead do SCP.
Cliente Interativo (sftp)
sftp user@host
sftp> ls # Listar remoto
sftp> cd /var/log # Mudar diretório remoto
sftp> pwd # Diretório atual remoto
sftp> get messages # Download
sftp> get -r /var/log /local/backup/ # Recursivo
sftp> put /local/arquivo.txt /remoto/ # Upload
sftp> rename arquivo.txt arquivo.bak
sftp> mkdir novo_dir; rm arquivo.tmp; rmdir vazio
sftp> symlink alvo link; stat arquivo.txt
sftp> lls; lcd /local # Operações locais
sftp> reget /remoto/grande.iso /local/ # Retomar download
sftp> reput /local/backup.tar /remoto/ # Retomar upload
sftp> help; quit
Operações Não-Interativas (Batch)
# Batch com arquivo de comandos
cat > /tmp/cmd.sftp <<EOF
cd /var/log
get messages /local/backup/
bye
EOF
sftp -b /tmp/cmd.sftp user@host
# Comando único direto (download/upload)
sftp user@host:/remoto/arquivo.txt /local/
sftp /local/arquivo.txt user@host:/remoto/
# Preservar atributos (perms, timestamps, owner)
sftp> put -P /local/arquivo /remoto/
4. Comparativo de Performance
| Cenário | SCP | SFTP |
|---|---|---|
| 1 arquivo grande | Similar | Similar (pouco melhor com pipelining) |
| 1000 arquivos pequenos | Lento (1 processo por arquivo) | Rápido (1 canal, pipeline) |
| Latência alta (intercontinental) | Muito lento | Significativamente melhor |
| Retomada após queda | Recria do zero | Continua do offset |
| Compressão | -C no SSH |
-C no SSH (igual) |
| Banda limitada | -l (Kbit/s) |
Não nativo; usar trickle/curl |
Em redes de alta latência (ex.: Brasil ↔ Europa, RTT 200ms), o SFTP pode ser 5-10x mais rápido que o SCP antigo para muitos arquivos pequenos, devido ao pipelining de comandos em um único canal.
5. Quando Usar Cada
| Caso | Recomendação | Motivo |
|---|---|---|
| Cópia única e ad-hoc | scp |
Sintaxe simples, comando único |
| Múltiplos arquivos | sftp (batch) ou rsync |
Performance |
| Navegação remota | sftp interativo |
Lista, cd, stat disponíveis |
| Script de automação | sftp -b ou rsync |
Idempotente, logs |
| Sincronização incremental | rsync over SSH |
Delta-sync, deleta/remove |
| Migração de servidor | rsync |
Resume, verificação |
| Compatibilidade legada | scp |
Servidores antigos sem sftp-server |
| Transferência Windows | WinSCP (SFTP) | GUI rica, fila |
6. rsync — A Alternativa Superior
Para a maioria dos casos reais, rsync sobre SSH é superior a ambos. Suporta delta-transfer (apenas blocos alterados), sincronização bidirecional, exclusão de arquivos removidos, retomada, verificação de integridade e preservação completa de atributos. Usa SSH como transporte com -e ssh.
# Sincronizar (espelho) com delete e exclusões
rsync -avz --delete /local/dir/ user@host:/remoto/dir/
# Delta-sync (apenas diferenças) com retomada
rsync -avz --partial --progress /local/grande.iso user@host:/remoto/
# Excluir padrões e usar chave SSH específica
rsync -avz --exclude='*.tmp' --exclude='.git/' \
-e "ssh -i ~/.ssh/chave_deploy" /local/ user@host:/remoto/
# Dry-run (simular antes de executar)
rsync -avzn /local/ user@host:/remoto/
7. Diagnóstico e Problemas Comuns
sftp -vvv user@host # Debug verbose
ssh user@host "grep -i subsystem /etc/ssh/sshd_config" # Verificar subsistema
echo "ls /" | sftp -b - user@host # Testar SFTP sem interação
scp -v /local/arq user@host:/remoto/ # SCP com verbose
scp -s /local/arq user@host:/remoto/ # Forçar SFTP no scp (OpenSSH 9+)
scp -O /local/arq user@host:/remoto/ # Forçar SCP legado
| Problema | Causa | Solução |
|---|---|---|
subsystem request failed |
sftp-server não habilitado |
Adicionar Subsystem sftp internal-sftp |
Permission denied após login |
Chroot sem permissões | ChrootDirectory com root:root 755 |
scp lento em rede intercontinental |
Overhead por arquivo | Usar sftp -r ou rsync |
bash: scp: command not found |
scp ausente no servidor |
Instalar openssh-client |
Connection closed após reget |
Servidor não suporta offset | Verificar versão do sftp-server |
8. Configuração no Servidor
# /etc/ssh/sshd_config
Subsystem sftp internal-sftp
# Chroot para usuarios SFTP-only (sem shell)
Match Group sftpusers
ChrootDirectory /home/%u
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
PermitTunnel no
internal-sftp é compilado dentro do sshd (sem binário externo), mais seguro para ambientes chroot. O ChrootDirectory deve ser propriedade de root:root com permissão 755 (ou 750), sem escrita para o usuário — subdiretórios internos podem ser do usuário.
9. Boas Práticas
| Prática | Recomendação |
|---|---|
| Subsistema | internal-sftp (sem binário externo) |
| Chroot | Para usuários SFTP-only |
| Autenticação | Chave SSH + passphrase (nunca senha) |
| Log | LogLevel VERBOSE + sftp-server -l INFO |
| Limite de banda | Match User com PermitTTY no, rate-limit via tc |
| Auditoria | audit.log para comando SFTP (-a) |
| Backup | rsync noturno com --link-dest para snapshots |
| Múltiplas sessões | MaxSessions 10 (default) |
10. Conclusão
SCP e SFTP coexistem historicamente, mas têm papéis distintos: SCP é uma relíquia de 1983 mantida por compatibilidade, enquanto SFTP é o protocolo moderno rico em operações. Desde OpenSSH 9.0 (2022), o scp usa internamente o protocolo SFTP, mantendo a CLI familiar mas eliminando as limitações do protocolo SCP legado. Para novos projetos, prefira sempre SFTP (cliente interativo ou batch) ou rsync sobre SSH, que oferecem melhor performance, operações ricas e capacidade de retomar transferências. SCP permanece útil apenas para comandos ad-hoc de arquivo único, especialmente em ambientes legados sem subsistema SFTP habilitado.