2015-01-29 2 views
0

Я попытался подключиться SSH к серверу и получить вывод для своих команд. Все работает нормально, если я выложу System.out. Если я хочу поместить его в JTextPane, он помещает его, но MC не читается.Отображение экрана Midnight Commander в JTextPane

Это мой код:

JSch jsch = new JSch(); 

String command = ""; 
String commandR = ""; 
host = null; 

if (arg.length > 1) { 
    host = arg[0]; 
    command = arg[2]; 
    commandR = arg[3]; 
} 

String user = host.substring(0, host.indexOf('@')); 
host = host.substring(host.indexOf('@') + 1); 
Session session = jsch.getSession(user, host, 22); 
Properties config = new Properties(); 
config.put("StrictHostKeyChecking", "no"); 
session.setConfig(config); 

session.setPassword(arg[1]); 
if (!session.isConnected()) { 
    session.connect(); 
} 

Channel channel = session.openChannel("shell"); 

String ans = " "; 
InputStream in = channel.getInputStream(); 
OutputStream out = channel.getOutputStream(); 
//channel.setInputStream(System.in); 
if (!channel.isConnected()) { 
    channel.connect(10 * 1000); 
} 
boolean logon = false; 
boolean started = false; 
boolean brtuser = false; 
boolean log = false; 
byte[] tmp = new byte[1024]; 

JFrame j = new JFrame(); 
JTextPane jj = new JTextPane(); 
jj.setContentType("text/html"); 
StyledDocument doc = (StyledDocument)jj.getDocument(); 
jj.setPreferredSize(new Dimension(500, 600)); 
j.setDefaultCloseOperation(2); 
j.add(new JScrollPane(jj)); 
j.pack(); 
j.setVisible(true); 
while (!started) { 

    while (in.available() > 0) { 
     int i = in.read(tmp, 0, 1024); 
     if (i < 0) { 
      break; 
     } 

     // jj.append(); 

     doc.insertString(doc.getLength(), new String(tmp, 0, i), null); 
     ans += new String(tmp, 0, i); 
     System.out.print(new String(tmp, 0, i)); 

Тогда я пишу pwd и mc - pwd я хорошо, но mc таково,

39m[49m                    
    [37m[40m                    [23;3H[22;1H[39m[49mGNU Midnight Commander 4.6.0              
     [1;1H[30m[46m Left  File  Command  Options  Right        
    [37m[44m+[0m[37m[44m<[37m[44m-[0m[37m[44m~[37m[44m---------------------------------[0m[37m[44mv>[37m[44m++[0m[30m[47m<[37m[44m-[0m[30m[47m~[37m[44m---------------------------------[0m[30m[47mv>[37m[44m+ 
    |[0m[1m[33m[44m  Name  [0m[37m[44m|[0m[1m[33m[44m Size [0m[37m[44m|[0m[1m[33m[44m MTime [0m[37m[44m||[0m[1m[33m[44m  Name  [0m[37m[44m|[0m[1m[33m[44m Size [0m[37m[44m|[0m[1m[33m[44m MTime [0m[37m[44m| 
    |[0m[1m[37m[44m/..    [0m[37m[44m|[0m[1m[37m[44mUP--DIR[0m[37m[44m|[0m[1m[37m[44m   [0m[37m[44m||[0m[30m[46m/..    [30m[46m|[0m[30m[46mUP--DIR[30m[46m|[0m[30m[46m   [37m[44m| 
    |[0m[1m[37m[44m/.mc    [0m[37m[44m|[0m[1m[37m[44m 1024[0m[37m[44m|[0m[1m[37m[44mJan 29 11:35[0m[37m[44m||[0m[1m[37m[44m/.mc  

Пожалуйста, помогите мне получить его просмотра!

ответ

0

«Мусор», который вы видите в JTextPane, является ANSI escape codes. Они определяют цвета и другое форматирование. Они использовались Midnight Commander (и другими приложениями) для визуализации GUI-подобного интерфейса на текстовой консоли.

Эквивалентные коды ANSI понимаются клиентами Terminal/SSH, такими как PuTTY. Даже в консольных окнах в различных ОС (например, Windows). Вероятно, это хорошо, когда вы печатаете вывод до System.out.

Но они не поняты JTextPane, он отображает их такими, какие они есть.

См. ANSI colors in Java Swing text fields для "ANSI color JTextPane подкласс".

+0

спасибо! это оно! – Mihail

Смежные вопросы