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

5

我正在尝试实现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();
}

那台服务器可以接收文件并将其存储在虚拟文件系统中。我可以读取文件/验证内容,但只能在文件被接收和存储后才能进行。目前基本身份验证就足够了,身份验证机制非常好文档化!
所以我的问题是:
- 是否有一种方式可以动态检查连接何时正在进行/内容何时正在传输,并在实际提交到目录之前拦截它。 - 还是我需要设置一个监听器来监视新文件的出现并相应地处理它?
提前感谢! Leigh.
1个回答

8
您好,您似乎认为SFTP与HTTP类似。即客户端打开一个“写”请求的连接(如HTTP PUT),将文件内容发送到请求主体中,断开连接,就完成了。
但这不是SFTP的工作方式。
SFTP就像一个远程文件系统。客户端连接到SSH/SFTP服务器并保持连接打开。在会话期间,客户端发送一个“打开”文件请求(具有读取或写入或两者权限),并获得已打开文件的句柄。然后它使用文件句柄发送一系列读/写块请求。最后关闭句柄。在单个会话期间,客户端可以(通常也会)读取/写入任意数量的文件。它甚至可以并行打开多个文件,以完全随机的顺序访问它们。这非常类似于应用程序与本地文件系统的工作方式。
影响:
- 您不能拒绝连接,因为连接请求本身与特定文件无关。您只能拒绝文件“打开”(或“创建”)请求。 拦截文件打开/创建请求的一种方法: - 派生NativeFileSystemView。 - 派生NativeSshFile。 - 覆盖NativeFileSystemView.createNativeSshFile以创建自己的NativeSshFile。 - 覆盖NativeFileSystemView.isWritable()。 - 您无法重定向SFTP连接。 SSH/SFTP不支持连接“重定向”(与HTTP不同)。 - 没有一个时刻您可以一次性在内存中拥有完整的文件,以便您可以某种方式检查它。相反,客户端按块发送文件。当然,您可以重新实现MINA SFTP“输入流”,使其将文件内容保存在内存中,并在收到“关闭”请求后检查完整的内容;只有在满意文件后才将其保存到磁盘上。但要注意DOS攻击。
更接近您想象的协议是SCP,它也在SSH上运行。对于它,有ScpTransferEventListener。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接