使用 JSch 通过 SSH 隧道访问生产环境中的 JMX

Posted

技术标签:

【中文标题】使用 JSch 通过 SSH 隧道访问生产环境中的 JMX【英文标题】:Accessing JMX in production via SSH tunnel using JSch 【发布时间】:2011-05-03 12:39:30 【问题描述】:

我正在尝试使用 JMX 自动执行一些操作。

它适用于开发环境。但是对于受防火墙保护的生产,我需要建立一个 SSH 隧道,然后只有我可以访问 JMX 控制台。

之前,我使用 putty 或 ssh 创建隧道并在本地运行我的 java 程序。由于我们使用了 1-2 台主机,因此更容易。现在它变成了多达10个主机。现在我不想每次都创建隧道并断开连接并运行程序。

我想做的是,使用 JSch 自动创建 SSH 隧道,并将 JMX 与 java 程序连接起来。我试图这样做,但它不起作用。

我得到 java.rmi.ConnectException:连接拒绝主机:localhost;嵌套异常是: java.net.ConnectException:连接被拒绝:连接

有可能吗?

【问题讨论】:

【参考方案1】:

为什么不使用Runtime.exec() 来启动ssh?示例:

public static void main(String[] args) 
  String[][] data = new String[][]new String[]"user@server1", "2000:server1:30",
          new String[]"user2@server4", "2000:server4:30";
  Process[] processes = new Process[data.length];
  for (int i=0; i<data.length; i++) 
    processes[i] = Runtime.getRuntime().exec("ssh", data[i][0], "-L", data[i][1], "-N");
  
  //do something else, for example, wait for user interaction here
  for (int i=0; i<data.length; i++) 
    processes[i].destroy();
  

【讨论】:

然后我只能通过隧道连接到一个盒子。我想并行启动多个隧道。 Runtime.exec 是系统范围的。即使您在每台服务器上执行一个线程,我也不确定。 我刚刚意识到你可以在一个循环中创建 ssh Process es(Runtime.exec() 启动程序后立即返回),等待用户按回车或某些功能完成,然后循环杀死所有这些进程。

以上是关于使用 JSch 通过 SSH 隧道访问生产环境中的 JMX的主要内容,如果未能解决你的问题,请参考以下文章

使用 JSch 创建一个通过 SSH 隧道化的 SOCKS 代理

android 使用jsch 开启ssh隧道 ssh tunnel

基于 JSCH (SSH) 和 HTTPS 的反向隧道

使用 JSCH Java 反向 SSH 隧道 [关闭]

JSch 多个隧道/跳转主机

JSch 多个隧道/跳转主机