我需要使用SSH连接从远程计算机运行一些命令,但问题如下:
客户端计算机(运行Windows)连接到一个网络,在那里我可以看到服务器远程(第二台* nix计算机,在同一网络中)。我可以用它做SSH连接,但是包含文件的计算机(运行* nix)不在这个网络中,我只能通过在第二台计算机上打开的动态SSH隧道连接到这里,我通常使用PuTTY来配置此连接。然后我就可以访问远程文件了。
以下图片代表架构(防火墙就像第二台机器):
我需要自动完成这项工作所以我已经用Java和JSch库做了一些测试,这里有一些代码:
/* Direccion y puerto del host local */
String host = "localhost";
int lport = 5040;
/* Direccion y puerto del host remoto*/
String rhost = "localhost";
int rport = 80;
/* Usuario y password para conectarse al servidor ssh*/
String user = "test";
String pwd = "test";
JSch jsch=new JSch();
Session session=jsch.getSession(user, host, 22);
session.setPassword("test");
Properties config = new Properties();
config.put("StrictHostKeyChecking","no");
session.setConfig(config);
session.connect();
int assinged_port=session.setPortForwardingL(lport, rhost, rport);
System.out.println("localhost:"+assinged_port+" -> "+rhost+":"+rport);
我有连接,但是当我使用对象session
运行命令时,答案来自第二台机器,而不是我预期的第三台机器。我想知道是否有另一个库有助于使这项工作或我使用错误的JSch。
答案 0 :(得分:1)
当然,如果设置rhost = "localhost"
,连接将到达SSH服务器,而不是“资源”服务器。
把正确的主机名放入,应该没问题。 (我这样做了一次。)
如果您想从JSch进行两个连接,而不是进行本地端口转发,然后连接到此转发端口,则可以使用我的ProxySSH
类来查找in the JSch wiki。 (我也是这样做的,就像你在那里一样。)
答案 1 :(得分:0)
您必须在端口转发后在第二台服务器上创建会话。然后建立与防火墙后面的服务器的连接。
查看example的代码。此代码的作用是创建一个本地端口转发到目标系统上的ssh端口,然后通过它连接。运行hostname命令说明它确实在转发系统上运行。
答案 2 :(得分:0)
您必须打开另一个使用转发端口的会话。
Session sessionA = jsch.getSession("usernameA", "hostA");
// ...
sessionA.connect();
int forwardedPort = 2222; // any port number which is not in use on the local machine
sessionA.setPortForwardingL(forwardedPort, "hostB", 22);
Session sessionB = jsch.getSession("usernameB", "localhost", forwardedPort);
// ...
sessionB.connect();
// Use sessionB here to execute your command