2012-07-17 85 views
0

我需要運行ssh命令來打開GUI應用程序。 我能夠讓Jsch運行這些命令,GUI顯示在客戶端機器上。我的問題是我似乎無法超越20個Jsch頻道。我認識到,服務器有一個控制用戶可以在這裏這似乎是20.我不明白是怎麼重用現有的連接,但運行不同的命令ssh連接數的設置....帶x11forwarding的Jsch shell命令 - 重用通道並運行新命令

我試圖運行的命令兩種不同的方式:

EXAMPLE Command: 

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

「1方式」)運行的每個命令創建一個新的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應用程序,它似乎並不釋放,因爲它仍然認爲我已經刷爆了,所以我得到JschException上channel.connect()的ssh連接;

我的問題是所有的命令打開GUI應用程序,因此當應用程序被關閉,關閉通道連接我不能告訴。

我寫的「其他方法」的方法思考,它不會創建一個新的ssh連接,但我應該被允許使用現有的連接,但發送一個新的命令。顯然它不會那樣工作。

我怎樣才能做到利用一個ssh連接時連接(命令)被調用運行不同的命令? Jsch有可能嗎?

+0

如果您只想在每個通道中執行一條命令,請使用exec通道而不是shell通道。 (不過,我不知道這是否對你的問題有幫助。) – 2012-09-22 17:18:01

+0

另外,你爲什麼要在你的「第二」方式上再次調用'connect()'? – 2012-09-22 17:20:42

回答

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(); 
} 
+0

顯然,一旦通道斷開連接,我將失去顯示信息。因此,如果我使用Jsch打開「xterm」窗口,然後在X11的xterm窗口中嘗試打開另一個GUI相關命令,如「gedit」或「nedit」,它會在GUI中間歇性地顯示「Display not found」。看起來雖然會話處於活動狀態,但當通道斷開連接時顯示信息丟失了。 – user1532138 2012-08-28 18:01:06