5

ApacheSSHd用のカスタムファイルシステムクラスを書いています。getクライアントが存在しないファイルを試したときに問題が発生しました。

私のオブジェクトはを返しますdoesExist() == false

これにより、サーバーはSSH_FXP_STATに応答してSSH_FX_NO_SUCH_FILEパケットを送信します。

OpenSSHクライアントを使用すると、これは正常に機能します。クライアントは「ファイル'/foo'が見つかりません」と報告します。

ただし、PSFTP(Putty SFTPクライアント)は要求をパイプライン処理するため、STATへの応答に関係なくOPENパケットを送信します。次に、結果のファイルハンドルにREADを送信します。これにより、現在、コードで例外が発生し、セッション全体が終了します。

存在しないファイルを読み取ろうとした場合、サーバーの応答はどうなりますか?

冗長性についてお詫び申し上げます。ここに問題のApacheコードがあります。私はそれを変更したくないのですが、私のクラスはここではSshFileの「ファイル」です。しかし、Apacheコードに間違いなくバグがある場合は、パッチを適用する必要があると思います。

    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());
       }
4

1 に答える 1

3

ステータスコードSSH_FXP_OPENも使用してリクエストに返信します。SSH_FX_NO_SUCH_FILEこれで、の問題が解決するはずpsftpです。

とにかく、アクティブなファイルとディレクトリのハンドルのレジスタを保持する必要があります。リモート側がアクティブでない、または適切なタイプではないハンドルの操作を要求した場合、SSH_FX_FAILUREステータスメッセージで応答します。error messageパケットのスロットを使用してSSH_FXP_STATUS、コードだけではあまり役に立たないため、より有益でユーザーフレンドリーなエラーを含めます。

于 2012-08-28T12:41:42.637 に答える