Как удалить цвета и т. д. из вывода ssh

Я использую jsch для получения вывода ssh с локального сервера ssh.

Когда я отображаю вывод в текстовом поле, я получаю все эти странные строки в выводе, например:

]0;~/rails_sites/rex_raid

[32mRob@shinchanii [33м~/rails_sites/rex_raid[0м

Я предполагаю, что [33m и [0m обозначают начало нового цвета или что-то в этом роде], а ]0;~ отмечает новую строку

как мне избавиться от этих выводов, анализирующих вывод для этих строк?

Вот пример (не от меня), как выглядит мой вывод:

http://www.google.de/codesearch#048v6jEeHAU/typescript&q=%5D0;~&l=1


person Nick Russler    schedule 26.08.2011    source источник


Ответы (3)


На самом деле это escape-последовательности управления терминалом VT100. Вы можете найти их список (не уверен, что он полный) по адресу http://www.termsys.demon.co.uk/vtansi.htm.

Вы можете использовать метод replaceAll строки (http://download.oracle.com/javase/1.4.2/docs/api/java/lang/String.html#replaceAll%28java.lang.String,%20java.lang.String%29) и создайте регулярные выражения, соответствующие всем допустимым escape-последовательностям VT100. Однако при создании регулярного выражения не забывайте, что перед квадратной скобкой стоит непечатаемый символ ESC (то есть  в Unicode).

person ShaMan-H_Fel    schedule 26.08.2011
comment
+1. JFI: Существуют различные типы терминалов (наиболее популярны ANSI, VT100, но существуют и другие), поэтому в общем случае, вероятно, потребуется более общий подход. - person Eugene Mayevski 'Callback; 26.08.2011
comment
Я согласен, в общем случае должен быть какой-то способ определить тип терминала. Тип терминала обычно хранится в переменной окружения TERM. См. tldp.org/HOWTO/Keyboard-and-Console-HOWTO-11. .html для получения подробной информации. - person ShaMan-H_Fel; 26.08.2011

Это управляющие последовательности ANSI. Как вы правильно догадались, они предназначены для реализации терминалом, показывающим, что они меняют цвет или один из некоторых атрибутов шрифта. (Они начинаются с символа Escape (ASCII 27), но, скорее всего, он не отображается в вашем текстовом поле.)

  1. Правильный способ сделать это - заставить вашу оболочку не печатать эти коды, если нет (или тупой) терминал. Но поскольку они часто жестко запрограммированы в сценариях (по крайней мере, в моем случае цвета подсказок жестко закодированы в .bashrc), это может быть непросто.

  2. Вы можете разобрать эти коды, либо удалить их, либо даже интерпретировать (чтобы сделать ваше текстовое поле цветным). Однажды я начал реализовывать последнюю часть, но я думаю, что могут быть существующие реализации.

person Paŭlo Ebermann    schedule 26.08.2011

Я также использую JSch и испытываю ту же проблему.

Для справки, в JSch Channel.setPtyType("ansi") перед подключением может удалить цвета ansi, чтобы вывод был приемлемым в Windows.

Не уверен, что этот параметр совместим со всеми удаленными серверами Linux/Unix.

person Tyler    schedule 03.09.2015