ssh - 对不存在文件上的 SFTP "open"的正确响应

标签 ssh protocols sftp

我正在为 Apache SSHd 编写自定义文件系统类。当客户尝试 get 时,我遇到了问题一个不存在的文件。

我的对象返回 doesExist() == false .

这会导致服务器发送 SSH_FX_NO_SUCH_FILE 数据包以响应 SSH_FXP_STAT。

使用 OpenSSH 客户端,这可以正常工作:客户端报告“找不到文件 '/foo'”。

但是,PSFTP(Putty SFTP 客户端)通过管道传输其请求,因此无论对 STAT 的响应如何,它都会发送一个 OPEN 数据包。然后它在生成的文件句柄上发送一个 READ,这当前在我的代码中导致异常,导致整个 session 终止。

当尝试读取不存在的文件时,服务器响应应该是什么?

抱歉冗长,这里是有问题的 Apache 代码。我不想修改它——我的类是这里的 SshFile"file"。但如果 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());
       }

最佳答案

回复SSH_FXP_OPEN也请求 SSH_FX_NO_SUCH_FILE状态码。这应该可以解决 psftp 的问题.

无论如何,您必须保留事件文件和目录句柄的寄存器。当远程端请求对未激活或类型不正确的句柄进行操作时,响应 SSH_FX_FAILURE状态消息。使用 error message SSH_FXP_STATUS 上的插槽数据包包含更多信息和用户友好的错误,因为代码不是很有用。

关于ssh - 对不存在文件上的 SFTP "open"的正确响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12091399/

相关文章:

python-2.7 - 在python中使用sftp从远程路径获取文件到本地目录

java - 使用小程序向 unix 机器发送 Tab 键事件

ssh - 将 ssh 选项传递给 ssh-copy-id

networking - 需要一些帮助来解释 tcpdump 输出

iphone - Objective-C,协议(protocol)和子类

bash - SFTP:返回远程目录中的文件数?

c# - C# 中有 SFTP 通信吗?

php脚本访问远程linux服务器并执行bash脚本

git - 在另一台计算机上使用 Github

C++ 到 Objective-C,在 for 循环中使用 const int