sli*_*lim 5 ssh sftp protocols
我正在为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());
}
Run Code Online (Sandbox Code Playgroud)
SSH_FXP_OPEN还使用状态代码回复请求SSH_FX_NO_SUCH_FILE。那应该可以解决问题psftp。
无论如何,您必须保留活动文件和目录句柄的寄存器。当远程端请求对未激活或类型不正确的句柄进行操作时,以SSH_FX_FAILURE状态消息进行响应。使用数据包error message上的插槽SSH_FXP_STATUS包含更多信息和用户友好的错误,因为代码不是很有用。