【问题标题】:How to remove colors etc. from ssh output如何从 ssh 输出中删除颜色等
【发布时间】:2011-08-26 14:03:23
【问题描述】:

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

【问题讨论】:

    标签: java colors ssh jsch


    【解决方案1】:

    这些实际上是 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),并创建一个匹配所有有效 VT100 转义序列的正则表达式。但是,在创建正则表达式时,不要忘记方括号前有不可打印的 ESC 字符(即 Unicode 中的 \u001B)。

    【讨论】:

    • +1。 JFI:存在不同的终端类型(ANSI、VT100 是最流行的,但也存在其他类型),因此在一般情况下可能需要更通用的方法。
    • 我同意,在一般情况下,应该采用某种方法来检测终端类型。终端类型通常存储在 TERM 环境变量中。详情请见tldp.org/HOWTO/Keyboard-and-Console-HOWTO-11.html
    【解决方案2】:

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

    1. 正确的做法是在没有(或哑)终端的情况下让您的 shell 不打印这些代码。但由于它们通常在脚本中硬编码(至少在我的帐户中,提示颜色在 .bashrc 中是硬编码的),这可能并不容易。

    2. 您可以解析这些代码,将它们去掉,甚至解释它们(使您的文本框变得丰富多彩)。我曾经开始实现最后一部分,但我认为周围可能有现有的实现。

    【讨论】:

      【解决方案3】:

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

      供您参考,在 JSch 中,Channel.setPtyType("ansi") 在 connect 之前可以去除 ansi 颜色,以便在 Windows 中可以接受输出。

      不确定此设置是否与所有远程 Linux/Unix 服务器兼容

      【讨论】:

        猜你喜欢
        • 2017-09-24
        • 2013-08-02
        • 2021-01-07
        • 2015-11-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多