在不存在的文件上对SFTP“打开”的正确响应

时间:2012-08-23 12:16:22

标签: ssh protocols sftp

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

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

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

使用OpenSSH客户端,这样可以正常工作:客户端报告" File' / 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());
       }

1 个答案:

答案 0 :(得分:3)

使用SSH_FXP_OPEN状态代码回复SSH_FX_NO_SUCH_FILE请求。这应该解决psftp的问题。

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