1

我需要运行 ssh 命令来打开 GUI 应用程序。我能够让 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 连接限制。]

或者

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

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有可能吗?

4

1 回答 1

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();
}
于 2012-07-18T17:21:10.963 回答