SFTP specificationを読む:
ファイル転送プロトコルが起動すると、クライアントが最初のサーバに(そのバージョン番号を含む) SSH_FXP_INITパケットを送信します。 サーバは、SSH_FXP_VERSIONパケットで応答し、最低値の とクライアントのバージョン番号を指定します。両者 は、特定のバージョンの プロトコルに従ってください。
お客様のクライアントは、SFTPバージョン2(および多分古いもの)のみをサポートしています。あなたのサーバーはSFTPバージョン3をサポートしています。だから交渉は失敗する。
3未満のSFTPプロトコルバージョンは実際には使用されませんでした。したがって、SFTPの実装ではこれらのバージョンをサポートしていないことはよくあることです。バージョン3は、最も広く使用されているバージョン(新しいバージョンをサポートしていないOpenSSHによってサポートされています)です。
私のクライアントコードは、常にSFTPサーバーにこれを送信するには...バージョン2を送信し、それはバージョン3
を送り返しSFTPサーバが低いバージョンまたはいずれかとSSH_FXP_VERSIONを返信することが必須ですクライアントがSSH_FXP_INITを送信した場合のデフォルトのバージョン
私は、クライアントが要求したバージョンより高いバージョンで応答することで、サーバーが標準に違反していると考えています。しかし、私は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として動作します(これはimhoですが、仕様違反です)。それは、具体的情報をSSH_FXP_VERSIONパケットを送信しないだけで3
私の他のテストマシンのみのバージョン3をサポート(オラクルMFT)、で追加されましたSSH_FXP_STATUS
応答にerror message
フィールドを追加しますが、SSH_FXP_STATUSていません通信は行われません。
これは正しい動作ですが、あなたにとっては不幸です。
私の状況をもう少し明確にしたいのですが、返信いただきありがとうございます。 第1のケース:クライアントコードは常にバージョン2を送信します(これはハードコードされています)、これは従来のコードと見なすことができます。これをSFTPサーバ(私のテストマシン)に送信すると、バージョン3が返されます。うまくいけば、これはサーバからのデフォルトの返信です。しかし、通信は正常に動作します。 第2のケース:私のクライアントコードは常にバージョン2(ハードコード)を送信し、バージョン3のみをサポートする他のテストマシン(oracle MFT)はSSH_FXP_VERSIONパケットを送信しませんが、情報なしのSSH_FXP_STATUSは通信しません。 ? –
私の質問はsftpサーバを中心にしています。つまり、クライアントがSSH_FXP_INITを送信した場合、SFTPサーバが下位バージョンまたは任意のデフォルトバージョンでSSH_FXP_VERSIONに返信することは必須です。 または、サーバーがクライアントSSH_FXP_INITを無視し、SSH_FXP_STATUSを送信していますか?私の理解によれば、交渉が行われると、バージョンは後でクライアントとサーバーの両方で追跡されます。私が間違っているなら、私を修正してください。 –
私の更新された回答を参照してください。 –