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

Iva*_*van 83 ssh scp sftp fish-protocol

以前觉得SCP是SSH复制文件的工具,SSH复制文件叫做SFTP,本身就是FISH的同义词。

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

如果它不一样,那么我误解了什么?

jsb*_*ngs 83

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

SCP 仅用于传输文件,不能执行其他操作,例如列出远程目录或删除文件,而 SFTP 可以执行这些操作。

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


更新 (2021/03/09):根据OpenSSH 8.0/8.0p1 (2019-04-17)的发行说明:

SCP协议是过时的,不灵活和不容易固定。我们建议使用更现代的协议,如 sftp 和 rsync 来代替文件传输。

  • 值得补充的是:还有FTPS,它是FTP over TLS。 (17认同)
  • @mikemaccana 然后您可以添加 FTPES 巫婆可以通过常规 ftp 连接显式使用 ftps (3认同)

sli*_*lim 45

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 协议。

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

警告:不要从 sshd2_config 中删除子系统 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'
Run Code Online (Sandbox Code Playgroud)

如果您正在与 Fish 服务器通话,那么它会解释该#RETR命令。但是,如果远程服务器没有安装 Fish 服务器,命令将由 shell 解释。首先是注释,然后是打印有关文件的信息的命令,然后是用一些标记包围的文件内容。

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

鱼的详细信息在此处的午夜指挥官源中。

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

  • 较旧的 SSH 服务器实现支持 scp 但不支持 SFTP;您不能将 SFTP 客户端用于这些
  • 使用 SFTP 提高性能、可靠性和灵活性
  • 您的“scp”客户端可能是伪装的 SFTP 客户端(需要引用
  • Fish 可能在利基环境中很有用,但在其他情况下使用更标准的 SFTP。


c2h*_*2h2 23

简单说一下:

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) 
Run Code Online (Sandbox Code Playgroud)

  • 但是“sftp”和“scp”需要服务器端的特殊程序,这与 FISH 不同,FISH 仅在远程 shell 中使用基本的 Unix 实用程序。 (2认同)
  • 您能否详细说明除了客户端之外,服务器端还需要“scp”吗?通过快速的谷歌搜索,我找不到任何确认服务器端也需要 `scp` 的内容。 (2认同)

N J*_*N J 12

FISH 和 SFTP 是相似的,正如观察到的都通过 SSH 工作,SFTP 需要 SSH 服务器中的特定支持和配置来促进传输,但它更安全一点,并且允许系统管理员只允许 SFTP(在这些情况下 FISH 获胜)不工作)。

FISH 需要一个 shell(例如 sh/rsh)来复制,因此需要对机器进行完全的 SSH 访问,我想它会更难保护(我无法客观地对此发表评论,因为我从来没有这样做过)。

在可能的情况下,我建议使用 SFTP、scp、FISH(按此顺序)。

维基百科鱼文章