1

我需要使用 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);

我得到了连接,但是当我使用 object 运行命令时session,答案来自第二台机器,而不是我预期的第三台机器。我想知道是否有另一个库可以帮助完成这项工作,或者我使用了错误的 JSch。

4

3 回答 3

1

当然,如果你设置rhost = "localhost",连接将到达 SSH 服务器,而不是“资源”服务器。输入正确的主机名,应该没问题。(我做过一次。)

如果您想从 JSch 进行两个连接,而不是进行本地端口转发然后连接到此转发端口,您可以使用我的ProxySSH课程,在 JSch wiki中查找。(我也这样做了,在与您类似的情况下。)

于 2012-02-14T23:16:14.953 回答
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
于 2018-05-30T06:48:48.440 回答
0

端口转发后,您必须在第二台服务器上创建会话。然后与防火墙后面的服务器建立连接。

以这段代码为例。这段代码所做的是创建一个本地端口转发到目标系统上的 ssh 端口,然后通过它进行连接。hostname 命令的运行说明它确实在转发到的系统上运行。

于 2016-05-21T00:25:45.450 回答