我正在使用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