使用java的多级ssh连接

时间:2014-08-26 08:45:59

标签: java swing bash ssh

我试图在本地计算机(linux)上使用swing GUI在远程计算机(linux)上运行一组脚本,并将命令输出(因为它正在运行)读回到文字区。

我尝试连接的机器在我的学校防火墙后面,所以我必须连接到它才能连接到它们。

典型的bash语法类似于:" ssh -t user1 @ host1 ssh -t user2 @ host2" 起初我尝试使用runtime()来直接唤起上面的命令,但这似乎根本不起作用,或者我可能错过了一些东西。我没有得到以下程序的输出。

    Process dirReader = Runtime.getRuntime().exec("ssh -t user1@host1 ssh -t user2@host2");
    InputStream stdout = dirReader.getInputStream();
    BufferedReader reader = new BufferedReader(new InputStreamReader(stdout));
    String line = reader.readLine();
    while(line != null){
        fileNames.add(line);
        line = reader.readLine();
    }
        reader.close();reader=null;
        stdout.close();stdout=null;
        dirReader.destroy();dirReader=null;

    } catch(IOException e){
        System.out.println("Exception: Error reading models directory");
        System.exit(1);
    }

当我用简单的事情来运行上面的内容时,例如" ls"我得到了预期的结果。我怀疑有些"特别" ssh需要治疗,所以我最近几天一直在和第三方图书馆搞混。 JSch和ganymed。

单级连接很简单,但是我担心我有点难以接受多重连接。你认为会有一个简单的解决方案,但我没有看到它。有几个人建议挖隧,但我也没有多少运气。

我认为在jSch中可以直接打开一个频道来模仿"一个控制台。这样可行,但对于我想做的事情来说似乎有些过分。还有一个控制台弹出我的GUI后是不可取的。

重申一点,我想:

  1. 建立与另一台服务器后面的计算机的ssh连接。
  2. 在该服务器上运行脚本
  3. 将该脚本的标准输出管道传回我的gui。
  4. 对#1的建议表示赞赏。

    我已经为此困扰了好几天。有几个相似的线程,但似乎没有人回答我的问题。如果它出现在Google的前5页,请随时向我发送链接;我有机会看到它。

1 个答案:

答案 0 :(得分:1)

经过多个小时的调查后,我终于遇到了以下情况:

How to use jsch with ProxyCommands for portforwarding

我不知道我是否遗漏了一些东西,但我发现至少有50个关于这个问题的线程没有一个令人满意的解决方案。

我猜这个故事的寓意是在你开始之前阅读所有的例子。

直接解决方案:http://www.jcraft.com/jsch/examples/JumpHosts.java.html

现在找到一种在Windows中执行此操作的方法。最好不要强迫用户安装ssh客户端。