我曾经认为SCP是通过SSH复制文件的工具,而通过SSH复制文件的方式称为SFTP,它本身就是FISH的同义词。
但是现在,当我在寻找Total Commander插件在Windows中执行此操作时,我注意到它的页面上显示“允许通过安全FTP(通过SSH的FTP)访问远程服务器。需要SSH2。这是不一样的作为SCP!”。
如果不一样,那我会误会什么?
我曾经认为SCP是通过SSH复制文件的工具,而通过SSH复制文件的方式称为SFTP,它本身就是FISH的同义词。
但是现在,当我在寻找Total Commander插件在Windows中执行此操作时,我注意到它的页面上显示“允许通过安全FTP(通过SSH的FTP)访问远程服务器。需要SSH2。这是不一样的作为SCP!”。
如果不一样,那我会误会什么?
Answers:
SFTP不是ssh上的FTP协议,而是SSH2(和某些SSH1实现)中包含的SSH协议的扩展。SFTP是类似于FTP的文件传输协议,但使用SSH协议作为网络协议(并受益于SSH处理身份验证和加密)。
SCP仅用于传输文件,不能做其他事情,例如列出远程目录或删除文件,SFTP可以做到。
FISH似乎是可以使用SSH或RSH传输文件的另一种协议。
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来源中。
从最终用户的角度来看,这一切意味着什么?
简单地说:
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)
sftp
并且scp
需要在服务器端使用特殊程序,这与FISH不同,后者在远程Shell中仅使用基本的Unix实用程序。
scp
用于scp或sftp-server)。而且确实确实存在某些情况,即远程端是“受限制的” Unix,您无法安装所需的东西:为了通过SSH(通过WiFi)将文件传输到Android,我编写了rpush-cat脚本集-也许FISH客户会工作。(tramp-fish.el
在Emacs中也可以:常规的TRAMP客户端由于stat
在Android上不存在而无法正常工作。)
scp
除客户端以外在服务器端还需要什么?通过Google的快速搜索,我找不到scp
在服务器端也需要确认的任何内容。
FISH和SFTP相似,并且观察到两者都可以通过SSH进行工作,SFTP需要在SSH服务器中提供特定的支持和配置以促进传输,但是它更加安全,并且允许SysAdmins仅允许SFTP(在这种情况下,FISH赢得了不起作用)。
FISH需要一个外壳程序(例如,sh / rsh)进行复制,因此需要对该计算机的完全SSH访问,我想这将变得更难保护(我从未对此发表过客观评论,我从未对此发表评论)。
如果可能的话,我建议使用SFTP,scp,FISH(按此顺序)。
scp
用于scp或sftp-server)。而且确实确实存在某些情况,即远程端是“受限制的” Unix,您无法安装所需的东西:为了通过SSH(通过WiFi)将文件传输到Android,我编写了rpush-cat脚本集-也许FISH客户会工作。(tramp-fish.el
在Emacs中也可以:常规的TRAMP客户端由于stat
在Android上不存在而无法正常工作。)