1

SFTP 客户端最初发送SSH_FXP_INIT(使用版本 2)。SFTP服务器不发送有什么原因SSH_FXP_VERSION吗?相反,它正在发送SSH_FXP_STATUS信息

SFTP 服务器仅支持版本 3

那么如何进行版本协商呢?
或者我错过了一些需要做的事情?

如果有人愿意了解问题并帮助我,我可以详细说明情况。请帮忙!

4

1 回答 1

3

阅读SFTP 规范

当文件传输协议启动时,客户端首先向服务器发送一个 SSH_FXP_INIT(包括其版本号)数据包。 服务器以 SSH_FXP_VERSION 数据包响应,提供它自己的最低版本号和客户端的版本号。 从那时起,双方都应遵守该特定版本的协议。

您的客户端仅支持 SFTP 版本 2(可能更旧)。您的服务器支持 SFTP 版本 3(可能更新)。所以谈判失败。

低于 3 的 SFTP 协议版本并没有真正使用。因此,SFTP 实现不支持这些版本是很常见的。版本 3 是迄今为止使用最广泛的版本(由不支持较新版本的 OpenSSH 支持)。


我的客户端代码总是发送版本 2...在将其发送到 SFTP 服务器时,它会发回版本 3

如果客户端发送 SSH_FXP_INIT,SFTP 服务器是否必须以较低版本或任何默认版本回复 SSH_FXP_VERSION

我认为服务器通过响应高于客户端要求的版本违反了标准。但我知道 OpenSSH SFTP 服务器可以做到这一点。它忽略了客户端的要求并始终以 3 响应。所以我假设您的测试机器使用 OpenSSH。

实际上3 和 2 (以及 1 和 0)之间的差异非常小:

  • 添加了 SSH_FXP_READLINK 和 SSH_FXP_SYMLINK 消息。

  • 添加了 SSH_FXP_EXTENDED 和 SSH_FXP_EXTENDED_REPLY 消息。

  • SSH_FXP_STATUS 消息已更改为包含“错误消息”和“语言标签”字段。

因此,如果客户端没有阻塞SSH_FXP_STATUS响应中的附加字段,您的 SFTP 2 客户端很可能可以与 SFTP 3 服务器通信。

实际上,OpenSSH SFTP 服务器在响应 3 时,如果客户端要求 2,则它的行为为 2(恕我直言,这又违反了规范)。它特别不将error message字段添加到SSH_FXP_STATUS响应中,该字段仅在 3 中添加。

我的另一台仅支持版本 3 的测试机( oracle MFT )不发送 SSH_FXP_VERSION 数据包,但 SSH_FXP_STATUS 带有信息并且不发生通信

这是正确的行为,虽然对你来说很不幸。

于 2016-10-20T06:35:14.517 回答