¿Cuál es la diferencia entre los protocolos SFTP, SCP y FISH?


59

Solía ​​pensar que SCP es una herramienta para copiar archivos a través de SSH, y copiar archivos a través de SSH se llama SFTP, que en sí mismo es sinónimo de FISH.

Pero ahora, cuando estaba buscando un complemento de Total Commander para hacer esto en Windows, me di cuenta de que en su página dice "Permite el acceso a servidores remotos a través de FTP seguro (FTP a través de SSH). Requiere SSH2. Esto NO ES lo mismo como SCP ".

Si no es lo mismo, ¿qué estoy entendiendo mal?


55
Esta es una extensión de una pregunta anterior . (@Ivan: hubiera sido útil mencionar esto.)
Gilles 'SO- deja de ser malvado'

Respuestas:


57

SFTP no es el protocolo FTP sobre ssh, sino una extensión del protocolo SSH incluido en SSH2 (y algunas implementaciones de SSH1). SFTP es un protocolo de transferencia de archivos similar al FTP pero utiliza el protocolo SSH como protocolo de red (y se beneficia al dejar SSH para manejar la autenticación y el cifrado).

SCP es solo para transferir archivos y no puede hacer otras cosas como enumerar directorios remotos o eliminar archivos, lo que SFTP sí hace.

FISH parece ser otro protocolo que puede usar SSH o RSH para transferir archivos.


11
Vale la pena agregar: también hay FTPS, que es FTP sobre TLS.
mikemaccana

3
@mikemaccana puede agregar FTPES, lo que es la posibilidad de usar ftps explícitamente a través de una conexión ftp regular
Kiwy

26

El protocolo SSH crea un túnel seguro a través del cual puede transferir un flujo bidireccional, y puede usar ese flujo para conectar los dos procesos que desee.

Los dos procesos más familiares serían un shell (en el servidor) y un emulador de terminal interactivo (en el cliente). Eso es lo que estás usando cuando ssh a un servidor y escribe comandos en el indicador del shell remoto.

SCP es la transferencia de archivos realizada utilizando solo ese shell y un comando remoto. En SCP, una vez que el cliente está conectado al servidor y se ha realizado toda la autenticación y autorización, el cliente envía al shell remoto un comando como scp -f myfile.txt, que simplemente escribe el contenido del archivo myfile.txt en la secuencia (para el cliente leer) o scp -t myfile.txtque lee de la secuencia y escribe en myfile.txt.

Notarás que -f y -t (para "from" y "to") no están en las páginas de manual de scp. Se consideran internos. Hay un esquema de reconocimiento ligero y un esquema para transferir directorios al envolver el contenido del archivo en encabezados simples. Pero en su mayor parte, SCP es una cuestión básica de escribir los bytes del archivo en el túnel SSH, permitiendo que SSH se ocupe de cosas complicadas como la compresión y la integridad.

SFTP es un protocolo de transferencia de archivos mucho más complejo, que nuevamente se canaliza a través de SSH.

En SFTP, tanto las solicitudes como las respuestas son paquetes codificados en binario con nombres como "SSH_FXP_OPEN", "SSH_FXP_STAT", "SSH_FXP_READ", "SSH_FXP_DATA", "SSH_FXP_CLOSE".

Una característica interesante del protocolo es que los comandos se pueden canalizar y las respuestas pueden venir en cualquier orden. Esto puede significar que las sesiones pasan menos tiempo esperando respuestas, y hay oportunidades para optimizar las transferencias concurrentes desde un servidor con fuentes de datos de varias velocidades, aunque no sé en qué medida se han aprovechado esas oportunidades.

SFTP tiene comandos para hacer muchas cosas que SCP no aborda; como eliminar, renombrar, truncar, mover, etc.

Todos los detalles están disponibles en un borrador de IETF .

Vale la pena señalar que los paquetes SSH más nuevos reemplazan el scpbinario del usuario con un enlace simbólico al binario SFTP. Este SFTP tiene el aspecto de scp, pero en secreto está usando el protocolo SFTP.

Cita - O'Reilly SSH: The Secure Shell, The Definitive Guide , sección 5.7 "Subsistemas":

ADVERTENCIA: No elimine la línea subsystem-sftp de sshd2_config: es necesario para que scp2 y sftp funcionen. Internamente, ambos programas ejecutan ssh2 -s sftp para realizar transferencias de archivos.

El pescado es una pieza interesante de la historia. Digamos que desea transferir archivos a través de SSH, pero su sistema remoto no tiene SCP. O quizás desee realizar operaciones de archivo más sofisticadas que SCP, pero su sistema remoto no tiene SFTP. Ninguno de esos escenarios es probable hoy, pero cuando se inventó Fish, lo fueron.

Entonces, los desarrolladores del cliente Midnight Commander se propusieron crear su propia solución. Es similar a scp en principio, pero hay más comandos. El cliente envía comandos que se parecen a:

 #RETR /some/name
 ls -l /some/name | ( read a b c d x e; echo $x ); echo '### 100'; cat /some/name; echo '### 200'

Si está hablando con un servidor Fish, interpretará el #RETRcomando. Sin embargo, si el servidor remoto no tiene un servidor Fish instalado, los comandos serán interpretados por el shell. Primero un comentario, luego un comando que imprime información sobre el archivo, seguido del contenido del archivo rodeado de algunos marcadores.

Efectivamente, en ausencia de scp o fish, el cliente ha "enrollado su propio" equivalente scp, pero igualmente puede enviar comandos de shell para cambiar el nombre, mover, truncar, etc.

Los detalles de Fish están en la fuente de Midnight Commander aquí .

¿Qué significa todo esto desde la perspectiva del usuario final?

  • las implementaciones de servidor SSH más antiguas admiten scp pero no SFTP; no puede usar un cliente SFTP con estos
  • Use SFTP para rendimiento, confiabilidad y flexibilidad
  • Su cliente "scp" podría ser un cliente SFTP disfrazado (se necesita cita )
  • El pescado puede ser útil en circunstancias específicas, pero de lo contrario utilice el SFTP más estándar.

20

Ponlo simple:

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) 

1
Pero sftpy scprequiere programas especiales en el lado del servidor, a diferencia de FISH, que usa solo las utilerías básicas de Unix en el shell remoto.
imz - Ivan Zakharyaschev

Según la descripción de FISH, una característica notable de FISH es que no requiere algo especial en el lado remoto (sin programa de servidor, como scpscp o sftp-server). Y hay casos en efecto cuando el lado remoto es un "restringida" Unix, donde no se puede instalar lo que quiere: para transferir archivos a Android a través de SSH (a través de WiFi), he escrito el conjunto de rpush-gato guiones - tal vez, un cliente FISH funcionaría. ( tramp-fish.elen Emacs también podría: el cliente TRAMP normal no funcionaba porque statno estaba en Android).
imz - Ivan Zakharyaschev

2
¿Podría explicar cómo scpse necesita también en el lado del servidor, además del lado del cliente? Con una búsqueda rápida en Google, no pude encontrar nada que confirme que scptambién se necesita en el lado del servidor.
Johannes Bittner

11

FISH y SFTP son similares, y como se observa, ambos funcionan sobre SSH, SFTP requiere soporte y configuración específicos en el servidor SSH para facilitar la transferencia, pero es un poco más seguro y permite que los SysAdmins solo permitan SFTP (en estas situaciones FISH ganó no funciona).

FISH requiere un shell (sh / rsh por ejemplo) para copiar, y por lo tanto requiere acceso SSH completo a la máquina, imagino que sería más difícil de asegurar (no puedo comentar objetivamente sobre esto ya que nunca he tenido que hacerlo).

Siempre que sea posible, recomendaría SFTP, scp, FISH (en ese orden).

Artículo de Wikipedia FISH


Según la descripción vinculada, una característica notable de FISH es que no requiere algo especial en el lado remoto (ningún programa de servidor, como scpscp o sftp-server). Y hay casos en efecto cuando el lado remoto es un "restringida" Unix, donde no se puede instalar lo que quiere: para transferir archivos a Android a través de SSH (a través de WiFi), he escrito el conjunto de rpush-gato guiones - tal vez, un cliente FISH funcionaría. ( tramp-fish.elen Emacs también podría: el cliente TRAMP normal no funcionaba porque statno estaba en Android).
imz - Ivan Zakharyaschev
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.