Несоответствие версии SFTP - SFTP-сервер поддерживает только версии 3
SFTP-клиент изначально отправляет SSH_FXP_INIT
(с версией 2). Есть ли причина, по которой SFTP-сервер не отправляет SSH_FXP_VERSION
? Вместо этого это отправка SSH_FXP_STATUS
с информацией
SFTP-сервер поддерживает только версии 3
Как тогда возможно согласование версии?
Или я что-то упускаю, что нужно сделать?
Я могу более детально проработать ситуацию, если кому-то нравится понять проблему и помочь мне. Пожалуйста помоги!
1 ответ
Прочитайте спецификацию SFTP:
Когда протокол передачи файлов запускается, клиент сначала отправляет пакет SSH_FXP_INIT (включая его номер версии) на сервер. Сервер отвечает пакетом SSH_FXP_VERSION, предоставляя самый низкий из его собственного и номер версии клиента. С тех пор обе стороны должны придерживаться этой конкретной версии протокола.
Ваш клиент поддерживает только SFTP версии 2 (и, возможно, старше). Ваш сервер поддерживает SFTP версии 3 (и, возможно, новее). Так что переговоры не удаются.
Версии протокола SFTP ниже 3 в действительности не использовались. Поэтому довольно часто реализации SFTP не поддерживают эти версии. Версия 3, безусловно, является наиболее широко используемой версией (поддерживаемой OpenSSH, которая не поддерживает более новые версии).
мой код клиента всегда отправляет версию 2... При отправке этого на сервер SFTP, он отправляет обратно версию 3
Обязательно ли для SFTP-сервера ответ SSH_FXP_VERSION с более низкой версией или любой версией по умолчанию, если клиент отправляет SSH_FXP_INIT
Я считаю, что сервер нарушает стандарт, отвечая более высокой версией, чем просил клиент. Но я знаю, что это делает OpenSSH SFTP-сервер. Он игнорирует запрос клиента и всегда отвечает 3. Поэтому я предполагаю, что ваша тестовая машина использует OpenSSH.
Там на самом деле очень небольшая разница между 3 и 2 (и 1 и 0):
Добавлены сообщения SSH_FXP_READLINK и SSH_FXP_SYMLINK.
Добавлены сообщения SSH_FXP_EXTENDED и SSH_FXP_EXTENDED_REPLY.
Сообщение SSH_FXP_STATUS было изменено для включения полей "сообщение об ошибке" и "языковой тег".
Поэтому вполне вероятно, что ваш клиент SFTP 2 может общаться с сервером SFTP 3, если клиент не захлебывается дополнительным полем в SSH_FXP_STATUS
ответы.
На самом деле SFTP-сервер OpenSSH, отвечая 3, ведет себя как 2, если клиент запросил 2 (это еще одно нарушение спецификации). Это конкретно не добавляет error message
поле к SSH_FXP_STATUS
ответы, которые были добавлены только в 3.
моя другая тестовая машина (oracle MFT), которая поддерживает только версию 3, не отправляет пакет SSH_FXP_VERSION, но SSH_FXP_STATUS с информацией и не связью происходит
Это имхо правильное поведение, хотя и неудачное для вас.