如何从ssh输出中移除颜色等内容。

4
我正在使用jsch从本地ssh服务器获取ssh输出。当我在文本框中显示输出时,例如:]0;~/rails_sites/rex_raid、[32mRob@shinchanii [33m~/rails_sites/rex_raid[0m等奇怪的字符串都会出现在输出中。我猜[33m和[0m标记了新颜色的开始或其他东西,而]0;~则标记了一个换行符。如何在不解析这些字符串的情况下摆脱它们?以下是我的输出示例(不是我写的):

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

3个回答

4
这些实际上是VT100终端控制转义序列。您可以在http://www.termsys.demon.co.uk/vtansi.htm找到它们的列表(不确定列表是否完整)。
您可以使用String的replaceAll方法(http://download.oracle.com/javase/1.4.2/docs/api/java/lang/String.html#replaceAll%28java.lang.String,%20java.lang.String%29),并创建一个匹配所有有效VT100转义序列的正则表达式。但是,在创建正则表达式时,请不要忘记方括号前有不可打印的ESC字符(即Unicode中的\u001B)。

1
JFI:存在不同的终端类型(ANSI、VT100是最流行的,但也存在其他类型),因此在通用情况下可能需要更一般化的方法。 - Eugene Mayevski 'Callback
我同意,在一般情况下应该有一种方法来检测终端类型。终端类型通常存储在TERM环境变量中。有关详情,请参阅http://tldp.org/HOWTO/Keyboard-and-Console-HOWTO-11.html。 - ShaMan-H_Fel

1

这些是 ANSI转义序列。正如你猜测的那样,它们旨在由显示器实现,以更改颜色或一些字体属性之一。(它们以Escape字符(ASCII 27)开头,但这可能不会显示在您的文本框中。)

  1. 正确的做法是,如果没有(或者是一个愚蠢的)终端,则使您的 Shell 不打印这些代码。但由于它们经常在脚本中硬编码(至少在我的账户中,提示颜色是硬编码在.bashrc中的),因此这可能并不容易。

  2. 您可以解析这些代码,要么将它们剥离掉,要么甚至解释它们(使您的文本框彩色)。我曾经开始实现最后一部分,但我认为现有的实现可能已经存在。


1

我也在使用JSch,并遇到了同样的问题。

供您参考,在JSch中,在连接之前使用Channel.setPtyType("ansi")可以删除ansi颜色,使输出在Windows上可接受。

不确定这个设置是否适用于所有远程Linux/Unix服务器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接