SFTP客户端最初发送SSH_FXP_INIT
(版本2)。 SFTP服务器没有发送SSH_FXP_VERSION
的原因吗?而是发送SSH_FXP_STATUS
信息
SFTP服务器仅支持版本3
如何进行版本协商?
或者我遗漏了一些需要做的事情?
如果有人喜欢了解问题并帮助我,我可以更详细地阐述情况。请帮忙!
答案 0 :(得分:2)
当文件传输协议启动时,客户端首先发送一个 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。
实际上非常小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中添加。
我的其他测试机器(oracle MFT)只支持版本3,不发送SSH_FXP_VERSION数据包,但是带有信息且没有通信的SSH_FXP_STATUS
这是正确的行为,虽然对你不幸。