如何基于Apache Mina SSHD实现只读VirtualFileSystemFactory?
为Apache Mina SSHD实现只读SFTP虚拟文件系统
要实现只读的VirtualFileSystemFactory,核心是在创建文件系统时拦截所有写操作。你的现有代码仅完成了用户根目录映射,未做只读限制,以下是改造方案:
改造思路
- 利用Apache Mina SSHD内置的
ReadOnlyDelegateFileSystem包装基础文件系统,自动拦截写操作(推荐) - 若需更细粒度控制,可自定义
FileSystem实现,重写所有涉及修改的方法并抛出异常
完整实现代码
VirtualFileSystemFactory virtualFileSystemFactory = new VirtualFileSystemFactory() { @Override public FileSystem createFileSystem(Session session) throws IOException { String username = session.getUsername(); Path dir = Paths.get("c:\\data\\"); if (dir == null) { throw new InvalidPathException(username, "无法解析主目录"); } // 创建基础根目录文件系统 FileSystem baseFileSystem = new RootedFileSystemProvider().newFileSystem(dir, Collections.emptyMap()); // 包装为只读文件系统,自动拦截所有写操作 return new ReadOnlyDelegateFileSystem(baseFileSystem); } }; // 为SFTP服务器设置只读文件系统工厂 sshd.setFileSystemFactory(virtualFileSystemFactory);
关键说明
ReadOnlyDelegateFileSystem会自动拦截创建文件/目录、修改、删除、重命名等所有写操作,抛出ReadOnlyFileSystemException- 该类在Mina SSHD 2.0及以上版本中提供,确保依赖版本符合要求
- 若需允许特定路径的写操作,可自定义
FileSystem实现,针对性重写允许修改的方法
内容的提问来源于stack exchange,提问作者Thanasis B
相关产品推荐
相关产品推荐

