Apache Mina SFTP服务器侧通道侦听器用于传入文件

时间:2015-04-17 11:46:41

标签: java listener sftp 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();
}

该服务器能够接收文件并将其存储在虚拟文件系统中。我可以读取文件/验证内容,但只能在接收和存储文件后。基本身份验证现在很好,幸好认证机制确实很好!

所以我的问题是:

  • 是否有办法在进行连接时/动态内容传输时动态检查,并在文件实际提交到目录之前拦截,即在文件实际提交到目录之前。

  • 我是否需要设置一个监听器,只需在出现新文件时查看目录并进行相应处理?

提前致谢! 利。

1 个答案:

答案 0 :(得分:5)

您似乎知道SFTP与HTTP的协议类似。即客户端打开与&#34;写&#34;的连接;请求(如HTTP PUT),发送请求正文的文件内容,断开连接和它。

这不是SFTP的工作方式。

SFTP就像一个远程文件系统。客户端连接到SSH / SFTP服务器并保持连接打开。在会话期间,客户端发送&#34;打开&#34;文件请求(具有读取或写入或两者权限)并获取打开文件的句柄。然后它使用文件句柄发送一系列读/写块请求。最后它关闭了手柄。在单个会话期间,客户端可以(并且通常确实)读/写或者它喜欢的任何数量的文件。它甚至可以并行打开几个文件,以完全随机的顺序访问它们。它与应用程序与本地文件系统的工作方式非常相似。

意义:

  • 当您不喜欢文件时,不能拒绝连接,因为连接请求本身与特定文件无关。你只能拒绝文件&#34;打开&#34; (或&#34;创建&#34;)请求。

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

    • 导出NativeFileSystemView
    • 导出NativeSshFile
    • 覆盖NativeFileSystemView.createNativeSshFile以创建NativeSshFile
    • 覆盖NativeFileSystemView.isWritable()
  • 您无法重定向SFTP连接。 SSH / SFTP不支持连接&#34;重定向&#34; (与HTTP不同)

  • 没有一个时刻你一次在内存中有一个完整的文件,所以你可以以某种方式检查它。而是客户端以块的形式发送文件。您当然可以重新实现MINA SFTP&#34;输入流&#34;以一种方式,它将文件内容保存在内存中,一旦你得到一个&#34;关闭&#34;请求;只有在对文件感到满意后才将文件保存到磁盘。但请注意DOS攻击。