我需要运行打开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来说可能吗?
答案 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();
}