使用x11forwarding的Jsch shell命令 - 重用通道并运行新命令

时间:2012-07-17 16:04:42

标签: java ssh jsch

我需要运行打开GUI应用程序的ssh命令。 我能够让Jsch运行命令,并且GUI显示在客户端计算机上。我的问题是我似乎无法超越20 Jsch频道。我意识到服务器有一个设置来控制用户可以进行的ssh连接的数量,这里似乎是20.我无法理解的是如何重用现有连接但运行不同的命令....

我尝试以两种不同的方式运行命令:

EXAMPLE Command:  

String command = "cd /home/test;xterm ";
String command = "cd /home/test;nedit myfile.txt ";

“1 way”)每个运行命令都会创建一个新的Jsch通道:

private void connect (String command) {    
    Channel channel = session.getChannel("shell");
    channel.setXForwarding(true);
    StringBufferInputStream reader = new StringBufferInputStream(command + " \n");
    channel.setInputStream(reader);
    channel.connect();
}

[此代码为每个新命令创建一个新通道。工作但达到20 ssh连接限制。 ]

“另一种方式”)试图重用频道来运行一个新的命令,其中channel是一个全局变量:

int numruns =0;
private void connect (String command, int channelId)    {
    String cmd = command + " \n";
    if (channel == null) {
        numruns = 0;
        channel = session.openChannel("shell");
        channel.setXForwarding(true);
        channel.connect();
        stdIn = channel.getOutputStream();
        stdOut = channel.getInputStream();
    } else {
        channel.connect(channelId);
    }
    ((OutputStream)stdIn).write(cmd.getBytes());
    stdIn.flush();
    numruns++;
}

[“其他方式”打开应用程序,但它似乎创建新的ssh连接。所以我仍然有20个ssh连接限制。]

所以看起来服务器最多只允许20个ssh连接。 但为什么它不适用于“其他方式”?

因此,当我关闭我的GUI应用程序时,它似乎不会释放ssh连接,因为它仍然认为我已经达到最大值所以我在channel.connect()上获得了JschException;

我的问题是所有命令都打开GUI应用程序,所以我无法判断该应用程序何时关闭以关闭通道连接。

我编写了“其他方式”方法,认为它不会创建新的ssh连接,但应该允许我使用现有连接但发送新命令。显然这不起作用。

如何在调用connect(command)时使用一个ssh连接来运行不同的命令?这对Jsch来说可能吗?

1 个答案:

答案 0 :(得分:0)

没解决!以下是有用的。它隐藏了这样一个事实:一旦Jsch通道连接关闭,任何“xterm”都不再具有显示信息。

=====================================

为了防止GUI在通道断开时消失,需要在命令前面带“nohup”或“xterm -hold -e”启动命令

因此...

示例命令:

String command = "cd /home/test;xterm";
String command = "cd /home/test;nohup nedit myfile.txt";  // this will only keep the GUI opened
String command = "cd /home/test;xterm -hold -e gedit myfile.txt";  // this one keeps the xterm window that kick off the program opened

因此,在对命令进行更改后,添加了Thread.sleep(1000),以便在断开通道之前给出应用程序时间。

这似乎有效!

private void connect (String command) {    
    Channel channel = session.getChannel("shell");
    channel.setXForwarding(true);
    StringBufferInputStream reader = new StringBufferInputStream(command + " \n");
    // or use
    // ByteArrayInputStream reader = new ByteArrayInputStream((command + " \n").getBytes());
    channel.setInputStream(reader);
    channel.setOuputStream(System.out);
    channel.connect();
    try {
        Thread.sleep(1000); // give GUI time to come up
    } catch (InterruptedException ex) {
        // print message
    }
    channel.disconnect();
}