Qual a diferença entre os protocolos SFTP, SCP e FISH?

59

Eu achava que o SCP é uma ferramenta para copiar arquivos pelo SSH, e copiar arquivos pelo SSH é chamado SFTP, que é sinônimo de FISH.

Mas agora, enquanto procurava um plug-in Total Commander para fazer isso no Windows, notei que em sua página diz "Permite acesso a servidores remotos via FTP seguro (FTP via SSH). Requer SSH2. Isso não é o mesmo como SCP! ".

Se não é o mesmo, então o que estou entendendo mal?

Ivan
fonte
5
Esta é uma extensão de uma pergunta anterior . (@Ivan: teria sido útil mencionar isso.)
Gilles 'SO- stop be evil'
Veja também superuser.com/q/134901/133844
Pere

Respostas:

57

SFTP não é o protocolo FTP sobre ssh, mas uma extensão ao protocolo SSH incluído no SSH2 (e em algumas implementações SSH1). O SFTP é um protocolo de transferência de arquivos semelhante ao FTP, mas usa o protocolo SSH como protocolo de rede (e se beneficia de deixar o SSH para lidar com a autenticação e criptografia).

O SCP é apenas para transferência de arquivos e não pode fazer outras coisas, como listar diretórios remotos ou remover arquivos, o que o SFTP faz.

O FISH parece ser outro protocolo que pode usar SSH ou RSH para transferir arquivos.

jsbillings
fonte
11
Vale acrescentar: também há FTPS, que é FTP sobre TLS.
Mikemaccana
3
@mikemaccana você pode adicionar FTPES bruxa é a possibilidade de usar ftps explicitamente através de uma conexão ftp regulares
kiwy
26

O protocolo SSH cria um túnel seguro através do qual você pode transferir um fluxo bidirecional e pode usá-lo 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 que você está usando quando ssh para um servidor e digita comandos no prompt do shell remoto.

O 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 foram feitas, o cliente envia ao shell remoto um comando como o scp -f myfile.txtqual apenas grava o conteúdo do arquivo myfile.txt no fluxo (para o cliente para ler) ou scp -t myfile.txtque lê do fluxo e grava em myfile.txt.

Você notará que -f e -t (para "de" e "para") não estão nas páginas de manual do scp. Eles são considerados internos. Há um esquema de reconhecimento leve e um esquema para transferir diretórios envolvendo o conteúdo do arquivo em cabeçalhos simples. Mas, na maioria das vezes, o SCP é uma questão básica de escrever os bytes do arquivo no túnel SSH, permitindo que o SSH lide com coisas complicadas, como compactação e integridade.

O SFTP é um protocolo de transferência de arquivos muito mais complexo, que é novamente sintonizado através do SSH.

No SFTP, solicitações e respostas são pacotes codificados em binário 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 canalizados e as respostas podem ocorrer em qualquer ordem. Isso pode significar que as sessões gastam menos tempo aguardando 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 possui comandos para fazer muitas coisas que o SCP não aborda; como excluir, renomear, truncar, mover etc.

Todos os detalhes estão disponíveis em um rascunho da IETF .

Vale ressaltar que os pacotes SSH mais recentes substituem o scpbinário do usuário por um link simbólico para o binário do SFTP. Esse SFTP tem a aparência do scp, mas, oculto, ele usa o protocolo SFTP.

Citação - O'Reilly SSH: O Shell Seguro, O Guia Definitivo , seção 5.7 "Subsistemas":

AVISO: Não remova a linha subsystem-sftp do sshd2_config: é necessário que o scp2 e o sftp funcionem. Internamente, os dois programas executam ssh2 -s sftp para executar transferências de arquivos.

O peixe é uma peça interessante da história. Digamos que você deseja transferir arquivos pelo SSH, mas seu sistema remoto não possui SCP. Ou talvez você queira executar operações de arquivo mais sofisticadas que o SCP, mas seu sistema remoto não possui SFTP. Atualmente, nenhum desses cenários é provável, mas quando o Fish foi inventado, eles eram.

Assim, os desenvolvedores do cliente Midnight Commander começaram a criar sua própria solução. É semelhante ao scp em princípio, mas há 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 conversando com um servidor Fish, ele interpretará o #RETRcomando. 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 entre alguns marcadores.

Efetivamente, na ausência de scp ou fish, o cliente "rolou seu próprio" equivalente scp - mas também pode enviar comandos do shell para renomear, mover, truncar etc.

Detalhes dos peixes estão na fonte Midnight Commander aqui .

O que tudo isso significa da perspectiva do usuário final?

  • implementações de servidor SSH mais antigas 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 ( citação necessária )
  • Os peixes podem ser úteis em circunstâncias de nicho, mas de outra forma usam o SFTP mais padrão.
magro
fonte
20

Simplificando:

SFTP = SSH + SFTP-server on server
SCP  = SSH + `scp` on server side
FISH = SSH + `dd` (and some other basic Unix utilities on the server side only) 
c2h2
fonte
11
Mas sftpe scprequer programas especiais no lado do servidor, ao contrário do FISH, que usa apenas recursos básicos do Unix no shell remoto.
imz - Ivan Zakharyaschev
De acordo com a descrição do FISH, um recurso notável do FISH é que ele não requer algo especial no lado remoto (nenhum programa de servidor, como scppara scp ou sftp-server). E há casos em que o lado remoto é um Unix "restrito", onde você não pode instalar o que deseja: para transferir arquivos para o Android através de SSH (sobre WiFi), escrevi o conjunto de scripts rpush-cat - talvez, um cliente FISH funcione. ( tramp-fish.elno Emacs também: o cliente TRAMP comum não funcionou porque statnão estava presente no Android.) #
970 Ivan Zakharyaschev
2
Você poderia explicar como scptambém é necessário no lado do servidor, além do lado do cliente? Com uma rápida pesquisa no google, não consegui encontrar nada que confirme o que scptambém é necessário no lado do servidor.
Johannes Bittner 26/10
11

O FISH e o SFTP são semelhantes e, como observado, ambos funcionam com SSH, o SFTP requer suporte e configuração específicos no servidor SSH para facilitar a transferência, mas é um pouco mais seguro e permite aos SysAdmins permitir apenas o SFTP (nessas situações, o FISH venceu não funciona).

O FISH requer um shell (sh / rsh, por exemplo) para copiar e, portanto, requer acesso SSH completo à máquina, eu imaginaria que seria mais difícil de proteger (não posso comentar objetivamente sobre isso, como nunca precisei).

Sempre que possível, eu recomendaria SFTP, scp, FISH (nessa ordem).

Artigo da Wikipedia sobre FISH

NJ
fonte
De acordo com a descrição vinculada, uma característica notável do FISH é que ele não requer algo especial no lado remoto (nenhum programa de servidor, como scppara scp ou sftp-server). E há casos em que o lado remoto é um Unix "restrito", onde você não pode instalar o que deseja: para transferir arquivos para o Android através de SSH (sobre WiFi), escrevi o conjunto de scripts rpush-cat - talvez, um cliente FISH funcione. ( tramp-fish.elno Emacs também: o cliente TRAMP comum não funcionou porque statnão estava presente no Android.) #
970 Ivan Zakharyaschev