Tôi đang viết các lớp hệ thống tệp tùy chỉnh cho Apache SSHd. Tôi đã gặp sự cố khi khách hàng cố gắng get
một tệp không tồn tại.Phản hồi đúng với SFTP "mở" trên tệp không tồn tại
Trả về đối tượng của tôi doesExist() == false
.
Điều này khiến máy chủ gửi gói SSH_FX_NO_SUCH_FILE để phản hồi lại SSH_FXP_STAT.
Sử dụng ứng dụng khách OpenSSH, tính năng này hoạt động tốt: khách hàng báo cáo "Tệp '/ foo' không tìm thấy".
Tuy nhiên, PSFTP (máy khách SFTP Putty) truyền các yêu cầu của nó, vì vậy nó sẽ gửi gói OPEN bất kể phản hồi cho STAT. Sau đó nó sẽ gửi một READ trên tập tin kết quả, hiện đang gây ra một ngoại lệ trong mã của tôi, điều này dẫn đến toàn bộ phiên chấm dứt.
Phản hồi của máy chủ sẽ là gì khi có nỗ lực đọc tệp không tồn tại?
Với lời xin lỗi vì sự chi tiết, đây là mã Apache được đề cập. Tôi không muốn sửa đổi nó - lớp của tôi là tệp "SshFile" ở đây. Nhưng nếu mã Apache chắc chắn là lỗi, tôi đoán tôi sẽ phải cung cấp cho họ một bản vá.
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());
}
Hmm, tôi đã hy vọng không phải sửa đổi mã SSHD Apache. Nó có thể là không thể tránh khỏi. Nó dường như làm điều đúng với V4 FXP_OPEN gói (trong đó có một lá cờ OPEN_EXISTING) nhưng không phải với V3 FXP_OPEN, mà không. Ngẫu nhiên, PSFTP dường như không truyền các thông báo lỗi từ các gói phản hồi tới UI: ( – slim