Apache SSHd用のカスタムファイルシステムクラスを作成しています。クライアントが存在しないファイルget
に接続しようとすると、問題が発生しました。存在しないファイルのSFTP "open"に対する正しい応答
私のオブジェクトはdoesExist() == false
を返します。
これにより、サーバーはSSH_FXP_STATに対する応答としてSSH_FX_NO_SUCH_FILEパケットを送信します。
OpenSSHクライアントを使用すると、これは正常に動作します。クライアントは「ファイル '/ foo'が見つかりません」と報告します。
しかし、PSFTP(パテSFTPクライアント)は要求をパイプライン処理するため、STATへの応答に関係なくOPENパケットを送信します。次に、結果のファイルハンドルに対してREADを送ります。これは現在、コード内で例外を引き起こし、セッション全体が終了します。
存在しないファイルを読み取ろうとすると、サーバーの応答はどうなるべきですか?
冗長にお詫び申し上げますが、ここには問題のApacheコードがあります。私はそれを変更したくない - 私のクラスはSshFile "ファイル"です。しかし、Apacheコードが間違いなくバグがあれば、私はそれらにパッチを付ける必要があります。 SSH_FX_NO_SUCH_FILE
ステータスコードでもSSH_FXP_OPEN
要求に
if (version <= 4) {
String path = buffer.getString();
int pflags = buffer.getInt();
// attrs
try {
SshFile file = resolveFile(path);
if (file.doesExist()) {
if (((pflags & SSH_FXF_CREAT) != 0) && ((pflags & SSH_FXF_EXCL) != 0)) {
sendStatus(id, SSH_FX_FILE_ALREADY_EXISTS, path);
return;
}
} else {
if (((pflags & SSH_FXF_CREAT) != 0)) {
if (!file.isWritable()) {
sendStatus(id, SSH_FX_FAILURE, "Can not create " + path);
return;
}
file.create();
}
}
String acc = ((pflags & (SSH_FXF_READ | SSH_FXF_WRITE)) != 0 ? "r" : "") +
((pflags & SSH_FXF_WRITE) != 0 ? "w" : "");
if ((pflags & SSH_FXF_TRUNC) != 0) {
file.truncate();
}
String handle = UUID.randomUUID().toString();
handles.put(handle, new FileHandle(file, pflags)); // handle flags conversion
sendHandle(id, handle);
} catch (IOException e) {
sendStatus(id, SSH_FX_FAILURE, e.getMessage());
}
ええと、私はApache SSHDコードを変更しないことを望んでいました。やむを得ないかもしれない。 V4 FXP_OPENパケット(OPEN_EXISTINGフラグを持っています)では正しく動作していますが、V3 FXP_OPENではそうではありません。ちなみに、PSFTPは、UIへの応答パケットからのエラーメッセージを渡すようには見えません。 – slim