【问题标题】:Jsch shell commands with x11forwarding - reuse channel and run new command带有 x11forwarding 的 Jsch shell 命令 - 重用通道并运行新命令
【发布时间】:2012-07-16 14:37:26
【问题描述】:

我需要运行 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 可以吗?

【问题讨论】:

  • 如果您只想在每个通道中执行单个命令,请使用 exec 通道,而不是 shell 通道。 (不过,我不知道这是否有助于解决您的问题。)
  • 另外,你为什么要在你的“第二种”方式上再次打电话给connect()

标签: java ssh jsch


【解决方案1】:

未解决!以下工作到一定程度。它隐藏了一个事实,即一旦 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();
}

【讨论】:

  • 显然,一旦频道断开,我就会丢失显示信息。因此,如果我使用 Jsch 打开“xterm”窗口,然后在 X11 的 xterm 窗口上,我会尝试打开另一个与 GUI 相关的命令,例如“gedit”或“nedit”,它会在 GUI 上间歇性地打开“找不到显示”。似乎虽然会话处于活动状态,但在通道断开连接时显示信息丢失了。
猜你喜欢
  • 2011-08-15
  • 1970-01-01
  • 2011-01-25
  • 2011-05-10
  • 2016-07-22
  • 1970-01-01
  • 1970-01-01
  • 2015-02-23
  • 2011-11-03
相关资源
最近更新 更多