import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import org.apache.commons.lang.StringUtils;
import org.fusesource.jansi.AnsiConsole;
import org.fusesource.jansi.AnsiString;
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
@ManagedBean
@SessionScoped
public class TerminalController {
BufferedReader fromChannel;
PrintWriter toChannel;
Channel channel;
Session session;
JSch jsch;
public TerminalController() {
jsch = new JSch();
try {
session = jsch.getSession("leoks", "localhost", 22);
session.setConfig("StrictHostKeyChecking", "no");
session.setPassword("xxx");
session.connect(Integer.MAX_VALUE); // 3 secs timeout
channel = session.openChannel("shell");
InputStream inStream = channel.getInputStream();
fromChannel = new BufferedReader(new InputStreamReader(inStream,
"UTF-8"));
OutputStream outStream = channel.getOutputStream();
toChannel = new PrintWriter(new OutputStreamWriter(outStream,
"UTF-8"));
channel.connect();
StringBuilder result = new StringBuilder();
boolean stop = false;
while (!stop) {
// prompt does not end with newline...
char c = (char) fromChannel.read();
result.append(c);
System.out.print(c);
if (result.toString().endsWith("$")) {
System.out.print("<<<");
stop = true;
}
}
} catch (Exception ee) {
ee.printStackTrace();
}
}
public String handleCommand(String command, String[] params)
throws IOException {
command = command + " " + StringUtils.join(params, " ");
toChannel.println(command);
toChannel.flush();
StringBuilder result = new StringBuilder();
AnsiConsole.systemInstall();
while (true) {
char c = (char) fromChannel.read();
result.append(c);
if (c == '$') {
AnsiString as = new AnsiString(result.toString());
String s = as.getPlain().toString();
s = s.replaceAll("\n", "<br>");
AnsiConsole.systemUninstall();
return s;
}
}
}
}
Jansi도 제대로 \ n BR와 터미널 구성 요소는 HTML을 렌더링하기 때문에 대체하기 위해 몇 가지 작업을 필요로하고 자동으로 제어 코드의 전체 모든 조작 된 문자열을 무시하는 HTML 렌더링 클래스가 있습니다. 당신은 또한 당신의 대답을 같은
.ui-widget
{
font-family: "Courier New", Courier, monospace;
font-size: 0.8em;
}
및
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:p="http://primefaces.org/ui">
<h:head>
<title>Terminal POC</title>
</h:head>
<h:body>
<h:outputStylesheet library="css" name="styles.css" />
<h:form>
<p:terminal
commandHandler="#{terminalController.handleCommand}"
height="300px"
welcomeMessage="Welcome..."
prompt=">" />
</h:form>
</h:body>
</html>
감사에게 많은 CSS를를 사용하여, 예를 들어, 고정 폭 글꼴로 터미널 CSS 정의를 대체 할 수 있습니다. Primefaces의 터미널 구성 요소가 터미널 에뮬레이션에 현명한 선택이 아니라는 사실은 내가 너무 늦게 알아 낸 것입니다. 솔직히 내가 좋아하는 두 가지 : 개인화 할 수있는 프롬프트 (xhtml 속성 포함) 및 명령 내역 (최대 100 개 이상). looksLikePrompt 메서드 나는 그것을 해결할 수 있지만 더 큰 문제가있다. 처음에는 Exec 채널을 사용하기 시작했지만 조건부 구조를 시도한 후에도 동일한 채널과 세션을 한 번 이상 재사용 할 수는 없으며 작동하지 않았습니다. JSch를 완전히 이해하지 못했습니다. – JohnTube
각 exec 채널은 한 번만 사용할 수 있지만 동일한 세션을 사용할 수 있어야합니다. 개별 명령 사이에서 session.disconnect()를 사용하지 마십시오 (그 후에 새 세션이 필요합니다). –
session.disconnect()를 사용하지 않았습니다! 내 코드가 누락 된 것 같아요 Thread.sleep (n); 또는 빈 범위를 선택하면 각 명령이 끝나면 자동으로 세션이 종료됩니다. – JohnTube