通过Java中的SSH隧道运行远程命令

时间:2012-02-14 19:21:12

标签: java ssh jsch ssh-tunnel

我需要使用SSH连接从远程计算机运行一些命令,但问题如下:

客户端计算机(运行Windows)连接到一个网络,在那里我可以看到服务器远程(第二台* nix计算机,在同一网络中)。我可以用它做SSH连接,但是包含文件的计算机(运行* nix)不在这个网络中,我只能通过在第二台计算机上打开的动态SSH隧道连接到这里,我通常使用PuTTY来配置此连接。然后我就可以访问远程文件了。

以下图片代表架构(防火墙就像第二台机器):

Architecture

我需要自动完成这项工作所以我已经用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。

3 个答案:

答案 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