прочитать SFTP specification:
При запуске протокола передачи файлов, клиент сначала отправляет 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.
Там на самом деле очень мало difference between 3 and 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 (это imho еще одно нарушение спецификации). Он специально не добавляет error message
поля к SSH_FXP_STATUS
ответам, который был добавлен только в 3.
моей другой тестовой машины (оракул MFT), которая поддерживает только версии 3, не посылает SSH_FXP_VERSION пакета, но SSH_FXP_STATUS с информацией и не происходит связь
Это imho правильное поведение, прискорбно для вас.
Спасибо за ответ Martin, но я хотел бы уточнить свою ситуацию немного больше: 1-й случай: мой клиентский код всегда отправляет версию 2 (это жестко закодировано), и вы можете предположить, что это устаревший код. При отправке этого файла на SFTP-сервер (мой тестовый компьютер) он отправляет обратно версию 3. Надеюсь, это ответ по умолчанию с сервера. Но общение прекрасно работает. 2-й случай: мой клиентский код всегда отправляет версию 2 (это жестко закодировано), а моя другая тестовая машина (oracle MFT), которая поддерживает только версию 3, не отправляет пакет SSH_FXP_VERSION, но SSH_FXP_STATUS с информацией, а не с сообщением. ? –
Итак, мой вопрос вращается на сервере sftp, то есть ... обязательным является для SFTP-сервера отвечать SSH_FXP_VERSION с более низкой версией или любой версией по умолчанию, если клиент отправляет SSH_FXP_INIT. Или сервер игнорирует клиентов SSH_FXP_INIT и отправляет SSH_FXP_STATUS? По моему пониманию, после того, как произойдет согласование, за версией последуют как клиент, так и сервер. Пожалуйста, поправьте меня, если я ошибаюсь. –
См. Мой обновленный ответ. –