Java com.jcraft.jsch.JSchException:侦听端口19999的远程端口转发失败

Java com.jcraft.jsch.JSchException:侦听端口19999的远程端口转发失败,java,spring,ssh,jsch,openssh,Java,Spring,Ssh,Jsch,Openssh,我已经设置了一个JavaWeb应用程序,它执行此代码以实现反向ssh FileInputStream hostFile = new FileInputStream(""+filePath); JSch jsch=new JSch(); java.util.Properties config = new java.util.Properties(); config.put("StrictHostKeyChecking", "no"); jsch.setKnownHosts(hostFi

我已经设置了一个JavaWeb应用程序,它执行此代码以实现反向ssh

 FileInputStream hostFile = new FileInputStream(""+filePath);
 JSch jsch=new JSch();
 java.util.Properties config = new java.util.Properties(); 
 config.put("StrictHostKeyChecking", "no");
 jsch.setKnownHosts(hostFile);
 Session session=jsch.getSession("centos", "192.168.0.8", 22); //THIS WORKS
 session.setConfig(config);
 session.setPassword(password);
 session.connect();
 session.setPortForwardingR(19999,"192.168.0.8",22); //FAILS HERE!!
但是,最后一行失败并抛出错误:com.jcraft.jsch.JSchException:侦听端口19999的远程端口转发失败

如果我从命令行运行该命令,它就会工作。所以我认为Jsch库是有缺陷的

 ssh -R 19999:localhost:22 centos@192.168.0.8

我相信您需要通过将代码放入while(true)循环来保持命令的运行

com.jcraft.jsch.JSchException:侦听端口19999的远程端口转发失败

如果我从命令行运行该命令,它会工作

最简单的解释是,当jsch会话请求转发端口时,由于某种原因,远程服务器无法绑定到端口19999。可能是因为其他进程绑定到该端口。可能是因为您的一个交互命令仍在运行并绑定到该端口

您可以在远程服务器上运行
netstat
,查看其他进程是否已经在使用端口19999。

session.setPortForwardingR(19999,"192.168.0.8",22);  

方法是session.setPortForwardingR(rport、lhost、lport);所以你应该给localhost

session.setPortForwardingR(19999,"localhost",22);