Прочтите спецификацию 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
Я считаю, что сервер нарушает стандарт, отвечая на более высокую версию, чем запрашивал клиент. Но я знаю, что это делает SFTP-сервер OpenSSH. Он игнорирует запросы клиента и всегда отвечает 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 с информацией, а не связь
Это, имхо, правильное поведение, пока что для вас прискорбно.
person
Martin Prikryl
schedule
20.10.2016