簡體   English   中英

用於傳入文件的 Apache Mina SFTP 服務器側通道偵聽器

[英]Apache Mina SFTP server side channel listener for incoming files

我想弄清楚如何為基於 Java 的 SFTP 服務器實現服務器端偵聽器,以提醒我注意傳入的文件傳輸。 我正在使用最新版本的 Apache Mina。 我的方案是讓我的服務器簡單地從客戶端接收一個文件,並在存儲之前對該文件執行“某些操作”。 這可能是錯誤檢查/規則驗證/將內容轉發到其他地方。 問題是我想在它保存在我的系統上之前這樣做。 我在文檔方面遇到了困難,並且找不到一個工作示例,該示例顯示了通過訪問傳入文件流實現的偵聽器。 我從指南中獲取了一個非常簡單的服務器:

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

該服務器能夠接收文件並將其存儲在虛擬文件系統上。 我可以讀取文件/驗證內容,但只有在收到並存儲文件之后。 基本身份驗證現在很好,值得慶幸的是,身份驗證機制確實有據可查!

所以我的問題是:

  • 是否有辦法動態檢查何時建立連接/何時傳輸內容並在文件實際提交到目錄之前攔截它。

要么

  • 我是否需要設置一個監聽器來簡單地觀察新文件出現的目錄並相應地處理它?

提前致謝! 利。

您似乎知道 SFTP 是類似於 HTTP 的協議。 即客戶端打開一個帶有“寫”請求的連接(如 HTTP PUT),發送請求正文的文件內容,斷開連接,就是這樣。

這不是 SFTP 的工作方式。

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

含義:

  • 當您不喜歡某個文件時,您不能拒絕連接,因為連接請求本身與特定文件無關。 您所能做的就是拒絕文件“打開”(或“創建”)請求。

    攔截文件打開/創建請求的一種方法:

    • 派生NativeFileSystemView
    • 派生NativeSshFile
    • 覆蓋NativeFileSystemView.createNativeSshFile以創建您的NativeSshFile
    • 覆蓋NativeFileSystemView.isWritable()
  • 您無法重定向 SFTP 連接。 SSH/SFTP 不支持連接“重定向”(與 HTTP 不同)

  • 沒有一個時刻您可以立即在內存中擁有一個完整的文件,以便您可以以某種方式檢查它。 相反,客戶端以塊的形式發送文件。 您當然可以重新實現 MINA SFTP“輸入流”,將文件內容保存在內存中,並在收到“關閉”請求后檢查完整內容; 只有在您對文件感到滿意后才將文件保存到磁盤。 不過要小心 DOS 攻擊。


更接近您想象的協議是 SCP,它也通過 SFTP 運行。 對於它,有ScpTransferEventListener

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM