O protocolo SSH cria um túnel seguro através do qual você pode transferir um fluxo bidirecional, e você pode usar esse fluxo para conectar quaisquer dois processos que desejar.
Os dois processos mais familiares seriam um shell (no servidor) e um emulador de terminal interativo (no cliente). Isso é o que você está usando quando você usa o ssh para um servidor e digita comandos no prompt do shell remoto.
SCP é a transferência de arquivos feita usando apenas esse shell e um comando remoto. No SCP, uma vez que o cliente está conectado ao servidor, e toda a autenticação e autorização foi feita, o cliente envia ao shell remoto um comando como scp -f myfile.txt
, que apenas grava o conteúdo do arquivo myfile.txt no fluxo ( para o cliente ler) ou scp -t myfile.txt
que lê o fluxo e grava em meuarquivo.txt.
Você notará que -f e -t (de "de" e "para") não estão nas páginas de manual do scp. Eles são considerados internos. Existe um esquema de reconhecimento leve e um esquema para transferir diretórios agrupando o conteúdo do arquivo em cabeçalhos simples. Mas, para a maior parte, o SCP é uma questão básica de gravar os bytes do arquivo no túnel SSH, permitindo que o SSH lide com coisas complicadas, como compactação e integridade.
SFTP é um protocolo de transferência de arquivos muito mais complexo, que é novamente sintonizado através do SSH.
No SFTP, as solicitações e respostas são pacotes codificados binários com nomes como "SSH_FXP_OPEN", "SSH_FXP_STAT", "SSH_FXP_READ", "SSH_FXP_DATA", "SSH_FXP_CLOSE".
Uma característica interessante do protocolo é que os comandos podem ser pipelinados e as respostas podem chegar em qualquer ordem. Isso pode significar que as sessões gastam menos tempo esperando respostas, e há oportunidades para otimizar transferências simultâneas de um servidor com fontes de dados de várias velocidades - embora eu não saiba até que ponto essas oportunidades foram aproveitadas.
O SFTP tem comandos para fazer muitas coisas que o SCP não resolve; como excluir, renomear, truncar, mover, etc.
Todos os detalhes estão disponíveis em um esboço da IETF .
Vale a pena notar que os pacotes SSH mais recentes substituem o usuário scp
binary por um symlink para o binário SFTP. Este SFTP tem a aparência de scp, mas sob as capas está usando o protocolo SFTP.
Citation -- O'Reilly SSH: The Secure Shell, The Definitive Guide, section 5.7 "Subsystems":
WARNING: Don't remove the subsystem-sftp line from sshd2_config: it is required for scp2 and sftp to work. Internally, both programs run ssh2 -s sftp to perform file transfers.
Fish é uma parte interessante da história. Digamos que você queira transferir arquivos via SSH, mas seu sistema remoto não possui SCP. Ou talvez você queira fazer operações de arquivo mais sofisticadas que o SCP, mas seu sistema remoto não tem SFTP. Nenhum desses cenários é provável hoje, mas quando Fish foi inventado, eles eram.
Assim, os desenvolvedores do Midnight Commander do cliente começaram a criar sua própria solução. É semelhante ao scp em princípio, mas existem mais comandos. O cliente envia comandos parecidos com:
#RETR /some/name
ls -l /some/name | ( read a b c d x e; echo $x ); echo '### 100'; cat /some/name; echo '### 200'
Se você estiver falando com um servidor Fish, ele interpretará o comando #RETR
. No entanto, se o servidor remoto não tiver um servidor Fish instalado, os comandos serão interpretados pelo shell. Primeiro um comentário, depois um comando que imprime informações sobre o arquivo, seguido pelo conteúdo do arquivo cercado em alguns marcadores.
Efetivamente, na ausência de scp ou fish, o cliente "rolou seu próprio" scp equivalente - mas pode igualmente enviar comandos shell para renomear, mover, truncar, etc.
Os detalhes de Fish estão na fonte Midnight Commander aqui .
O que isso tudo significa do ponto de vista do usuário final?
- implementações mais antigas de servidores SSH suportam scp, mas não SFTP; você não pode usar um cliente SFTP com estes
- Use SFTP para desempenho, confiabilidade e flexibilidade
- Seu cliente "scp" pode ser um cliente SFTP disfarçado ( Citation needed )
- O peixe pode ser útil em circunstâncias específicas, mas use o SFTP mais padrão.