我正在使用Primefaces的終端組件和JSch ssh到遠程桌面。由於執行通道的執行需要很多時間,因爲會話和通道都在每個命令處關閉,我沒有設法解決這個問題。所以我將頻道改爲shell,現在我試圖「重定向」標準輸入/輸出隊列。這裏是我的代碼的樣子:將JSch的標準iostream重定向到primefaces終端
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
@ManagedBean
@SessionScoped
public class TerminalController implements Serializable{
public TerminalController(){
jsch=new JSch();
InputStream in=null;
PrintStream out=System.out;
try{
session=jsch.getSession(user, ip, port);
session.setConfig("StrictHostKeyChecking", "no");
session.setPassword(passwd);
session.connect();
channel=session.openChannel("shell");
channel.setInputStream(in);
channel.setOutputStream(out);
channel.connect();
}catch(Exception ee){
System.out.println(ee);
} }
public String handleCommand(String command, String[] params) {
command=command+StringUtils.join(params," ");
in=IOUtils.toInputStream(command);
String result=out.toString();
out.flush();
return result;}
我知道這是一團糟,我仍然是java的初學者。 我想到的另一個問題是,在從iostream到字符串的轉換中,我可能會失去輸入按鈕功能!我在等你的建議,解決方案和建議。
非常感謝您的回答。那麼Primefaces的終端組件不是終端仿真的明智選擇,這一事實我覺得太晚了。說實話,我喜歡它的兩件事是:個性化提示(帶有xhtml屬性)和命令歷史記錄(最多100個或更多)。 looksLikePrompt方法我可以解決,但我遇到了更大的問題。起初,我開始使用Exec頻道,但我不能重複使用相同的頻道,甚至不止一次嘗試條件結構,它不工作。我不完全瞭解JSch。 – JohnTube
每個可執行通道只能使用一次(對於一個命令),但您應該可以使用同一會話。不要在各個命令之間使用session.disconnect()(之後,您需要一個新的會話)。 –
我沒有使用session.disconnect()!我認爲我的代碼缺少的是Thread.sleep(n);或者,在每個命令之後,bean作用域的選擇會自動結束會話。 – JohnTube