我试图弄清楚如何为基于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();
}
该服务器能够接收文件并将其存储在虚拟文件系统中。我可以读取文件/验证内容,但只能在接收和存储文件后。基本身份验证现在很好,幸好认证机制确实很好!
所以我的问题是:
或
提前致谢! 利。
答案 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攻击。