2015-04-17 186 views
0

我想弄清楚如何實現基於Java的SFTP服務器的服務器端偵聽器,以提醒我傳入的文件傳輸。我正在使用最新版本的Apache Mina。我的場景是我的服務器只需從客戶端接收文件並在存儲文件之前對文件執行「某些操作」。這可能是錯誤檢查/規則驗證/轉發其他地方的內容。事情是我想在它保存在我的系統之前這樣做。我對文檔有困難,無法找到一個工作示例,它顯示了一個可以訪問傳入文件流的偵聽器。我已經從導向截取的非常簡單的服務器:Apache Mina SFTP服務器端通道偵聽器傳入文件

public void setupServer() throws IOException { 

    sshd = SshServer.setUpDefaultServer(); 
    sshd.setFileSystemFactory(new NativeFileSystemFactory() { 
     @Override 
     public FileSystemView createFileSystemView(final Session session) { 
      return new NativeFileSystemView(session.getUsername(), false) { 
       @Override 
       public String getVirtualUserDir() { 
        return testFolder.getRoot().getAbsolutePath(); 
       } 
      }; 
     }; 
    }); 
    sshd.setPort(8001); 
    sshd.setSubsystemFactories(Arrays 
      .<NamedFactory<Command>> asList(new SftpSubsystem.Factory())); 
    sshd.setCommandFactory(new ScpCommandFactory()); 
    sshd.setKeyPairProvider(new SimpleGeneratorHostKeyProvider(testFolder 
      .newFile("hostkey.ser").getAbsolutePath())); 
    sshd.setPasswordAuthenticator(new PasswordAuthenticator() { 
     public boolean authenticate(final String username, final String password, 
       final ServerSession session) { 

      return StringUtils.equals(username, USERNAME) 
        && StringUtils.equals(password, PASSWORD); 
     } 
    }); 

    // SessionListener event = new SessionListener(); 

    sshd.start(); 
} 

該服務器能夠接收文件並存儲它的虛擬文件系統上的。我可以讀取文件/驗證內容,但只能在收到並存儲文件之後。基本認證現在很好,認證機制真的很好地記錄在案!

所以我的問題是:

  • 是否有檢查時動態連接正在取得/時的內容被轉移並攔截,因爲它是即發生之前,該文件實際上是犯了一個手段到一個目錄。

  • 我需要設置一個聽衆,他們似乎根本看新的文件的目錄並進行處理相應的?

在此先感謝! Leigh。

回答

3

您似乎有一個想法,即SFTP與HTTP的協議類似。即客戶端用「寫入」請求(如HTTP PUT)打開連接,發送請求主體的文件內容,斷開連接,就是這樣。

這不是SFTP的工作原理。

SFTP就像一個遠程文件系統。客戶端連接到SSH/SFTP服務器並保持連接打開。在會話期間,客戶端發送「打開」文件請求(具有讀取或寫入或兩種權限),並獲取已打開文件的句柄。然後它使用文件句柄發送一系列讀/寫塊請求。最後它關閉手柄。在單個會話期間,客戶端可以(並且通常)讀取/寫入或者同時包含任意數量的文件。它甚至可以同時打開多個文件,以完全隨機的順序訪問它們。這與應用程序與本地文件系統一起使用的方式非常相似。

啓示:

  • 你不能拒絕連接時,你不喜歡一個文件,因爲連接請求本身並不與特定文件關聯。您只能拒絕文件「打開」(或「創建」)請求。

    一種方式來截取文件打開/創建請求:

    • 導出NativeFileSystemView
    • 導出NativeSshFile
    • 覆蓋NativeFileSystemView.createNativeSshFile創建您NativeSshFile
    • 覆蓋NativeFileSystemView.isWritable()
  • 不能重定向的SFTP連接。 SSH/SFTP不支持連接「重定向」(不像HTTP)

  • 有沒有一個時刻你一次在內存中有一個完整的文件,以便你可以以某種方式檢查它。相反,客戶端以塊的形式發送文件。您當然可以重新實現MINA SFTP「輸入流」,以便將文件內容保存在內存中,並在收到「關閉」請求後檢查完整的內容;只有在對文件滿意後,才能將文件保存到磁盤。儘管謹防DOS攻擊。

+0

嘿,謝謝你的回覆,我想攔截文件,然後「登陸」服務器,因爲我想要路由它。我要求儘可能無盤,並且不要將文件存儲在此SFTP服務器上(出於安全考慮)。如果我正在嘗試的是不可能的,那麼這是可以改變的,只是臨時存儲它,直到聽衆撿起它。理想情況下,我想攔截請求,因爲它正在進入,並根據例如發件人安全組來適當地進行過濾......這可能意味着打開一個新連接以將其傳遞到另一臺服務器或拒絕請求。 –

+0

感謝您的詳細信息。你能把它們納入你的問題嗎?使用該帖子下方的「修改」鏈接。 –

+0

@LeighGriffin我根據您的評論更新了我的答案並提供了更多詳細信息。 –

相關問題