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

时间:2014-09-24 21:56:11

标签: java spring ssh jsch openssh

我已经设置了一个java Web应用程序来执行此代码以反向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

3 个答案:

答案 0 :(得分:2)

  

com.jcraft.jsch.JSchException:侦听端口19999的远程端口转发失败   ...
  如果我从命令行运行命令,它可以正常工作

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

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

答案 1 :(得分:0)

我相信你需要通过将代码置于while(true)循环中来保持运行命令。

答案 2 :(得分:0)

更改代码
session.setPortForwardingR(19999,"192.168.0.8",22);  

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

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