SFTP,SCP和FISH协议之间有什么区别?


59

我曾经认为SCP是通过SSH复制文件的工具,而通过SSH复制文件的方式称为SFTP,它本身就是FISH的同义词。

但是现在,当我在寻找Total Commander插件在Windows中执行此操作时,我注意到它的页面上显示“允许通过安全FTP(通过SSH的FTP)访问远程服务器。需要SSH2。这是不一样的作为SCP!”。

如果不一样,那我会误会什么?


5
这是先前问题的扩展。(@Ivan:提到这一点将有所帮助。)
Gilles

Answers:


57

SFTP不是ssh上的FTP协议,而是SSH2(和某些SSH1实现)中包含的SSH协议的扩展。SFTP是类似于FTP的文件传输协议,但使用SSH协议作为网络协议(并受益于SSH处理身份验证和加密)。

SCP仅用于传输文件,不能做其他事情,例如列出远程目录或删除文件,SFTP可以做到。

FISH似乎是可以使用SSH或RSH传输文件的另一种协议


11
值得补充的是:还有FTPS,即基于TLS的FTP。
mikemaccana

3
@mikemaccana,然后可以添加FTPES巫婆是可以通过常规ftp连接显式使用ftp的可能性
Kiwy 2014年

26

SSH协议创建了一个安全隧道,通过该隧道可以传输双向流,并且可以使用该流连接所需的任何两个进程。

最熟悉的两个过程是外壳(在服务器上)和交互式终端仿真器(在客户端上)。这就是在SSH到服务器并在远程Shell提示符下键入命令时所使用的方式。

仅使用该外壳程序和远程命令即可完成SCP的文件传输。在SCP中,一旦客户端连接到服务器,并且所有身份验证和授权均已完成,客户端就会向远程Shell发送一个命令,如scp -f myfile.txt,该命令会将myfile.txt文件的内容写入流中(对于客户端读取)或scp -t myfile.txt从流中读取并写入myfile.txt。

您会注意到-f和-t(用于“从”和“到”)不在scp联机帮助页中。它们被认为是内部的。有一个轻量级的确认方案,以及一种通过将文件内容包装在简单的标头中来传输目录的方案。但是在大多数情况下,SCP是将文件的字节写入SSH隧道的基本问题,让SSH处理诸如压缩和完整性之类的复杂内容。

SFTP是一种更为复杂的文件传输协议,它再次通过SSH进行隧道传输。

在SFTP中,请求和响应都是二进制编码的数据包,其名称类似于“ SSH_FXP_OPEN”,“ SSH_FXP_STAT”,“ SSH_FXP_READ”,“ SSH_FXP_DATA”,“ SSH_FXP_CLOSE”。

该协议的一个有趣特征是命令可以流水线化,并且响应可以以任何顺序进行。这可能意味着会话花在等待响应上的时间更少,并且有机会优化来自具有不同速度数据源的一台服务器的并发传输-尽管我不知道这些机会被利用到了什么程度。

SFTP具有执行SCP不能处理的许多功能的命令。如删除,重命名,截断,移动等。

所有详细信息都可以在IETF草案中找到

值得注意的是,较新的SSH软件包将用户scp二进制文件替换为SFTP二进制文件的符号链接。该SFTP具有scp的外观,但在幕后它使用的是SFTP协议。

引文 -O'Reilly SSH:《安全外壳》,权威指南,第5.7节“子系统”:

警告:请勿从sshd2_config中删除subsystem-sftp行:scp2和sftp必须工作。在内部,两个程序都运行ssh2 -s sftp来执行文件传输。

是一段有趣的历史。假设您想通过SSH传输文件,但是您的远程系统没有SCP。或者,也许您想执行比SCP更复杂的文件操作,但是您的远程系统没有SFTP。如今,这两种情况都不大可能,但是当发明了Fish时,它们就是了。

因此,客户端Midnight Commander的开发人员着手创建自己的解决方案。它在原理上类似于scp,但是有更多命令。客户端发送如下命令:

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

如果您正在与Fish服务器通信,则它将解释#RETR命令。但是,如果远程服务器未安装Fish服务器,则Shell将解释命令。首先是注释,然后是打印文件信息的命令,然后是文件内容,并在某些标记中括起来。

实际上,在没有scp或fish的情况下,客户端已经“滚动了自己的” scp等效项-但它可以同样发送shell命令来重命名,移动,截断等。

Fish的详细信息在此处的Midnight Commander来源中。

从最终用户的角度来看,这一切意味着什么?

  • 较旧的SSH服务器实现支持scp,但不支持SFTP;您不能将SFTP客户端与这些
  • 使用SFTP获得性能,可靠性和灵活性
  • 您的“ scp”客户端可能是变相的SFTP客户端(需要引文
  • 在小众环境下,Fish可能会有用,但在其他方面则使用更标准的SFTP。

20

简单地说:

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
但是,sftp并且scp需要在服务器端使用特殊程序,这与FISH不同,后者在远程Shell中仅使用基本的Unix实用程序。
imz-伊万·扎哈拉里舍夫(Ivan Zakharyaschev)2012年

根据FISH的描述,FISH的显着特征是它不需要在远程端进行任何特殊操作(不需要服务器程序,例如scp用于scp或sftp-server)。而且确实确实存在某些情况,即远程端是“受限制的” Unix,您无法安装所需的东西:为了通过SSH(通过WiFi)将文件传输到Android,我编写了rpush-cat脚本集-也许FISH客户会工作。(tramp-fish.el在Emacs中也可以:常规的TRAMP客户端由于stat在Android上不存在而无法正常工作。)
imz-Ivan Zakharyaschev 2012年

2
您能否详细说明scp除客户端以外在服务器端还需要什么?通过Google的快速搜索,我找不到scp在服务器端也需要确认的任何内容。
Johannes Bittner

11

FISH和SFTP相似,并且观察到两者都可以通过SSH进行工作,SFTP需要在SSH服务器中提供特定的支持和配置以促进传输,但是它更加安全,并且允许SysAdmins仅允许SFTP(在这种情况下,FISH赢得了不起作用)。

FISH需要一个外壳程序(例如,sh / rsh)进行复制,因此需要对该计算机的完全SSH访问,我想这将变得更难保护(我从未对此发表过客观评论,我从未对此发表评论)。

如果可能的话,我建议使用SFTP,scp,FISH(按此顺序)。

维基百科FISH文章


根据链接的描述,FISH的显着特征是它不需要在远程端进行任何特殊操作(不需要服务器程序,例如scp用于scp或sftp-server)。而且确实确实存在某些情况,即远程端是“受限制的” Unix,您无法安装所需的东西:为了通过SSH(通过WiFi)将文件传输到Android,我编写了rpush-cat脚本集-也许FISH客户会工作。(tramp-fish.el在Emacs中也可以:常规的TRAMP客户端由于stat在Android上不存在而无法正常工作。)
imz – Ivan Zakharyaschev 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.