Apache MINA SSHD服务器连接失败:subsystem request failed on channel 0报错
解决Apache MINA SSHD SFTP连接时
subsystem request failed on channel 0的问题 问题原因
出现该错误的核心原因是未在SSH服务器中注册SFTP子系统。SFTP作为SSH的专属文件传输子系统,你的当前代码仅配置了Shell和SCP支持,没有启用SFTP子系统,导致客户端发起SFTP子系统请求时,服务器无法识别并响应。
解决方案
需要在代码中添加SFTP子系统的配置,具体操作如下:
- 创建
SftpSubsystemFactory实例,用于处理SFTP子系统的请求 - 将该工厂实例添加到SSH服务器的子系统工厂列表中
修改后的完整代码如下:
import org.apache.sshd.server.SshServer; import org.apache.sshd.server.command.ScpCommandFactory; import org.apache.sshd.server.keyprovider.SimpleGeneratorHostKeyProvider; import org.apache.sshd.server.sftp.SftpSubsystemFactory; import org.apache.sshd.server.shell.ProcessShellFactory; import java.nio.file.Paths; import java.util.Collections; public class Main { public static void main(String[] args) { SshServer sshd = SshServer.setUpDefaultServer(); sshd.setPort(22); sshd.setKeyPairProvider(new SimpleGeneratorHostKeyProvider(Paths.get("hostkey.ser"))); sshd.setShellFactory(new ProcessShellFactory("/bin/sh", "-i", "-l")); sshd.setCommandFactory(new ScpCommandFactory()); // 注册SFTP子系统 SftpSubsystemFactory sftpFactory = new SftpSubsystemFactory(); sshd.setSubsystemFactories(Collections.singletonList(sftpFactory)); sshd.setPasswordAuthenticator(new MyPasswordAuthenticator()); try { System.err.println("Starting SSHD on port 22"); sshd.start(); Thread.sleep(Long.MAX_VALUE); System.err.println("Exiting after a very (very very) long time"); } catch (Exception e) { e.printStackTrace(); } } }
关键说明
SftpSubsystemFactory是Apache MINA SSHD专门为SFTP子系统提供的处理工厂,必须注册到服务器才能开启SFTP支持- 确保项目依赖中包含
sshd-sftp模块(如使用Maven,需引入对应依赖),否则会出现SftpSubsystemFactory类找不到的问题
内容的提问来源于stack exchange,提问作者Jonny Marotte
相关产品推荐
相关产品推荐

