我已经设置了一个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
答案 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