Apache Mina SFTP服务器端通道侦听器,用于接收文件

Lei*_*fin 1 java sftp listener mina

我试图弄清楚如何为基于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();
}
Run Code Online (Sandbox Code Playgroud)

该服务器能够接收文件并将其存储在虚拟文件系统上。我只能在收到并存储文件后才能读取文件/验证内容。目前基本身份验证还不错,感谢您对身份验证机制的详细记录!

所以我的问题是:

  • 有没有一种方法可以动态检查何时建立连接/何时传输内容,以及在发生连接时即在将文件实际提交到目录之前进行拦截。

要么

  • 我是否需要设置一个侦听器,以仅在目录中监视新文件的出现并对其进行相应处理?

提前致谢!eigh

Mar*_*ryl 5

您似乎有一个想法,即SFTP与HTTP相似。也就是说,客户端使用“写”请求(例如HTTP PUT)打开连接,发送请求正文的文件内容,然后断开连接。

这不是SFTP的工作方式。

SFTP就像一个远程文件系统。客户端连接到SSH / SFTP服务器,并使连接保持打开状态。在会话期间,客户端发送“打开”文件请求(具有读或写或同时具有两个特权),并获得打开文件的句柄。然后,它使用文件句柄发送一系列读/写块请求。最后,它关闭了手柄。在单个会话中,客户端可以(并且通常可以)读取/写入或读取/写入任意数量的文件。它甚至可以并行打开多个文件,以完全随机的顺序访问它们。它与应用程序与本地文件系统一起使用的方式非常相似。

含义:

  • 当您不喜欢文件时,无法拒绝连接,因为连接请求本身未与特定文件关联。您所能做的就是拒绝文件“打开”(或“创建”)请求。

    拦截文件打开/创建请求的一种方法:

    • 派生NativeFileSystemView
    • 派生NativeSshFile
    • 覆盖NativeFileSystemView.createNativeSshFile创建您的NativeSshFile
    • 覆写 NativeFileSystemView.isWritable()
  • 您不能重定向SFTP连接。SSH / SFTP不支持“重定向”连接(不同于HTTP)

  • 没有一个时刻可以一次将一个完整的文件存储在内存中,因此您可以通过某种方式对其进行检查。客户端改为分块发送文件。当然,您可以通过以下方式重新实现MINA SFTP“输入流”:将文件内容保存在内存中,并在收到“关闭”请求后检查完整内容;仅在对文件满意后才将文件保存到磁盘。但是要注意DOS攻击。