【发布时间】:2017-03-01 21:47:36
【问题描述】:
SFTP 客户端最初发送 SSH_FXP_INIT(带有版本 2)。 SFTP服务器不发送SSH_FXP_VERSION有什么原因吗?相反,它发送带有信息的SSH_FXP_STATUS
SFTP 服务器仅支持版本 3
那么如何进行版本协商呢?
还是我错过了一些需要做的事情?
如果有人愿意了解问题并帮助我,我可以更详细地说明情况。请帮忙!
【问题讨论】:
SFTP 客户端最初发送 SSH_FXP_INIT(带有版本 2)。 SFTP服务器不发送SSH_FXP_VERSION有什么原因吗?相反,它发送带有信息的SSH_FXP_STATUS
SFTP 服务器仅支持版本 3
那么如何进行版本协商呢?
还是我错过了一些需要做的事情?
如果有人愿意了解问题并帮助我,我可以更详细地说明情况。请帮忙!
【问题讨论】:
文件传输协议启动时,客户端首先发送一个 SSH_FXP_INIT(包括它的版本号)包到服务器。 服务器以 SSH_FXP_VERSION 数据包响应,提供 自己的版本号和客户端的版本号中的最低者。 双方 从那时起,应遵守该特定版本的 协议。
您的客户端仅支持 SFTP 版本 2(可能更旧)。您的服务器支持 SFTP 版本 3(可能更新)。所以协商失败。
SFTP 协议版本低于 3 并没有真正使用。因此,SFTP 实现不支持这些版本是很常见的。版本 3 是迄今为止使用最广泛的版本(受 OpenSSH 支持,不支持较新的版本)。
我的客户端代码总是发送版本 2...在将其发送到 SFTP 服务器时,它会发回版本 3
如果客户端发送 SSH_FXP_INIT,SFTP 服务器是否必须以较低版本或任何默认版本回复 SSH_FXP_VERSION
我认为服务器响应高于客户端要求的版本违反了标准。但我知道 OpenSSH SFTP 服务器可以做到这一点。它会忽略客户端的要求并始终以 3 响应。所以我假设您的测试机器使用的是 OpenSSH。
实际上有非常小的difference between 3 and 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 带有信息且不发生通信
这是正确的行为,虽然对你来说很不幸。
【讨论】: