我正在为 Apache SSHd 编写自定义文件系统类。get
当客户端尝试访问不存在的文件时,我遇到了问题。
我的对象返回doesExist() == false
。
这会导致服务器发送 SSH_FX_NO_SUCH_FILE 数据包以响应 SSH_FXP_STAT。
使用 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());
}