2012-08-23 12 views
5

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()); 
     } 

Trả lời

3

Trả lời SSH_FXP_OPEN yêu cầu cũng có mã trạng thái SSH_FX_NO_SUCH_FILE. Điều đó sẽ giải quyết vấn đề với psftp.

Dù sao, bạn phải giữ sổ đăng ký của các tập tin và thư mục hoạt động. Khi phía từ xa yêu cầu một thao tác cho một tay cầm không hoạt động hoặc không đúng loại, hãy trả lời với thông báo trạng thái SSH_FX_FAILURE. Sử dụng khe error message trên gói SSH_FXP_STATUS để bao gồm thêm thông tin và lỗi thân thiện với người dùng vì mã chỉ không hữu ích.

+1

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