我以前以为SCP是一个通过SSH复制文件的工具,而通过SSH复制文件称为SFTP,它本身就是FISH的同义词。
但现在,当我在 Windows 中寻找 Total Commander 插件来执行此操作时,我注意到它的页面上写着“允许通过安全 FTP(通过 SSH 的 FTP)访问远程服务器。需要 SSH2。这不一样”作为SCP!”。
如果不一样那我误解了什么?
答案1
SFTP不是基于 ssh 的 FTP 协议,而是 SSH2(以及某些 SSH1 实现)中包含的 SSH 协议的扩展。 SFTP 是一种与 FTP 类似的文件传输协议,但使用 SSH 协议作为网络协议(并受益于让 SSH 来处理身份验证和加密)。
SCP 仅用于传输文件,不能执行其他操作,例如列出远程目录或删除文件,而 SFTP 可以执行这些操作。
鱼似乎是还有另一个协议可以使用 SSH 或 RSH 来传输文件。
更新(2021/03/09):根据发行说明OpenSSH 8.0/8.0p1 (2019-04-17):
这SCP协议已经过时、不灵活且不易修复。我们建议使用更现代的协议(例如 sftp 和 rsync)进行文件传输。
答案2
SSH 协议创建一个安全隧道,您可以通过该隧道传输双向流,并且可以使用该流连接您喜欢的任何两个进程。
最熟悉的两个进程是 shell(在服务器上)和交互式终端仿真器(在客户端上)。这就是您通过 ssh 连接到服务器并在远程 shell 提示符下键入命令时所使用的内容。
SCP是否仅使用该 shell 和远程命令完成文件传输。在 SCP 中,一旦客户端连接到服务器,并且完成了所有身份验证和授权,客户端就会向远程 shell 发送类似 的命令scp -f myfile.txt
,该命令仅将文件 myfile.txt 的内容写入流中(对于客户端读取)或scp -t myfile.txt
从流中读取并写入 myfile.txt。
您会注意到 -f 和 -t(代表“from”和“to”)不在 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 协议。
引文——奥莱利SSH:安全 Shell,权威指南,第 5.7 节“子系统”:
警告:不要从 sshd2_config 中删除subsystem-sftp 行:scp2 和sftp 需要它才能工作。在内部,两个程序都运行 ssh2 -s sftp 来执行文件传输。
鱼是一段有趣的历史。假设您想通过 SSH 传输文件,但您的远程系统没有 SCP。或者您可能想要执行比 SCP 更复杂的文件操作,但您的远程系统没有 SFTP。这两种情况在今天都不太可能出现,但当 Fish 被发明时,它们却出现了。
所以客户端的开发者午夜指挥官开始创建自己的解决方案。原理上和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 的情况下,客户端已使用 shell 命令“推出了自己的”scp 等效项 - 但它同样可以发送 shell 命令来重命名、移动、截断等。
Fish 的详细信息请参见 Midnight Commander 源代码这里。
从最终用户的角度来看,这一切意味着什么?
- 较旧的 SSH 服务器实现支持 scp 但不支持 SFTP;您不能将 SFTP 客户端与这些一起使用
- 使用 SFTP 提高性能、可靠性和灵活性
- 您的“scp”客户端可能是伪装的 SFTP 客户端(需要引用)
- Fish 在特定情况下可能有用,但在其他情况下请使用更标准的 SFTP。
答案3
简单来说:
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)
答案4
FISH 和 SFTP 类似,正如观察到的那样,两者都通过 SSH 工作,SFTP 需要 SSH 服务器中的特定支持和配置来促进传输,但它更安全一点,并且允许系统管理员仅允许 SFTP(在这些情况下,FISH 获胜)不起作用)。
FISH 需要 shell(例如 sh/rsh)来复制,因此需要对机器的完全 SSH 访问,我想它会更难保护(我无法客观地评论这一点,因为我从来没有这样做过)。
如果可能,我建议使用 SFTP、scp、FISH(按顺序)。