2015-04-17 128 views
0

我想弄清楚如何实现基于Java的SFTP服务器的服务器端侦听器,以提醒我传入的文件传输。我正在使用最新版本的Apache Mina。我的场景是我的服务器只需从客户端接收文件并在存储文件之前对文件执行“某些操作”。这可能是错误检查/规则验证/转发其他地方的内容。事情是我想在它保存在我的系统之前这样做。我对文档有困难,无法找到一个工作示例,它显示了一个可以访问传入文件流的侦听器。我已经从导向截取的非常简单的服务器:Apache Mina SFTP服务器端通道侦听器传入文件

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。

回答

3

您似乎有一个想法,即SFTP与HTTP的协议类似。即客户端用“写入”请求(如HTTP PUT)打开连接,发送请求主体的文件内容,断开连接,就是这样。

这不是SFTP的工作原理。

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

启示:

  • 你不能拒绝连接时,你不喜欢一个文件,因为连接请求本身并不与特定文件关联。您只能拒绝文件“打开”(或“创建”)请求。

    一种方式来截取文件打开/创建请求:

    • 导出NativeFileSystemView
    • 导出NativeSshFile
    • 覆盖NativeFileSystemView.createNativeSshFile创建您NativeSshFile
    • 覆盖NativeFileSystemView.isWritable()
  • 不能重定向的SFTP连接。 SSH/SFTP不支持连接“重定向”(不像HTTP)

  • 有没有一个时刻你一次在内存中有一个完整的文件,以便你可以以某种方式检查它。相反,客户端以块的形式发送文件。您当然可以重新实现MINA SFTP“输入流”,以便将文件内容保存在内存中,并在收到“关闭”请求后检查完整的内容;只有在对文件满意后,才能将文件保存到磁盘。尽管谨防DOS攻击。

+0

嘿,谢谢你的回复,我想拦截文件,然后“登陆”服务器,因为我想要路由它。我要求尽可能无盘,并且不要将文件存储在此SFTP服务器上(出于安全考虑)。如果我正在尝试的是不可能的,那么这是可以改变的,只是临时存储它,直到听众捡起它。理想情况下,我想拦截请求,因为它正在进入,并根据例如发件人安全组来适当地进行过滤......这可能意味着打开一个新连接以将其传递到另一台服务器或拒绝请求。 –

+0

感谢您的详细信息。你能把它们纳入你的问题吗?使用该帖子下方的“修改”链接。 –

+0

@LeighGriffin我根据您的评论更新了我的答案并提供了更多详细信息。 –

相关问题