繁体   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