有趣的Shell输出:[01; 32mtestfile.txt [00m而不是testfile.txt

问题:当我使用ChannelShell发送命令时,我收到了“有趣”的字符输出,我想知道如何获得在PuTTY会话中看到的常规输出。

“搞笑”我的意思是我应该看到这个:

testfile.txt 

我看到这个:

 [01;32mtestfile.txt[00m 

这与这个问题类似,除了答案不能满足我的需要。 答案是在ChannelShell上调用setPty(false) ,它完全移除了“伪terminal”,但我需要实时从ChannelShell获得输出。 以下是我正在做的一个例子:

 ChannelShell channel = (ChannelShell) session.openChannel("shell"); channel.setOutputStream(new PrintStream( new ByteArrayOutputStream(), true, "UTF-8") { @Override public void write(byte[] b, int off, int len) { super.write(b, off, len); String output = new String(b, off, len); System.out.print(output); sendNextCommand(output); //Execution of the next command depends on the output here, this is why I need it to not have the funny characters. } }); PipedInputStream in = new PipedInputStream(); channelInput = new PipedOutputStream(in); channel.setInputStream(in); channel.connect(); while(!channel.isClosed() && channelWaitRetries++ < MAX_CHANNEL_WAIT_RETRIES) { //Wait for additional output... Sort of a timeout deal. Kind of a hack... sleep(2500); //Calls Thread.sleep. I just don't want the try/catch here. System.out.println("Channel not yet closed. Retried " + channelWaitRetries + " of " + MAX_CHANNEL_WAIT_RETRIES); } 

sendNextCommand方法是执行检查以查看输出是否与下一个要执行的命令需要显示的内容匹配的位置。 所以基本上,当我看到这样的东西: [user@server ~]$ [01;32mtestfile.txt[00m [user@server ~]$然后执行这个: ls应该返回这个: testfile.txt而是它返回这个: [01;32mtestfile.txt[00m不复制和粘贴第一个字符,但它是一个字符代码为27的盒子,我认为它是一个转义字符)。

现在我通常只是逃避这种事情,但我宁愿把它做​​好,也似乎有一些怪异的变种。 所以我在这里。 我希望你能帮助:)

注意:我通过我的IDE通过我的Windows机器(一个eclipse rip-off)来运行这个,但是我试过debugging,并且variablesoutput实际上显示了“有趣”的字符。 我也尝试在一个JOptionPane.messageDialog显示它,以确保它不仅仅是IDE,而且它还有字符。 谢谢!

Solutions Collecting From Web of "有趣的Shell输出:[01; 32mtestfile.txt [00m而不是testfile.txt"

是的,在ls的情况下,这些是ANSI转义序列来控制颜色。

ls有一个--color=never选项,它可以解决特定的ls问题。

这是发生在所有的命令,还是只是一些?

调用ChannelShell.setPtyType("dumb")也可以帮助(未经测试)。 您可能需要小心地找到禁用转义序列的终端类型。

任何特定的原因,你正在炮轰ls而不是使用内置的Java方法来检查目录内容?

这是一个黑暗的总体镜头,但看起来像UNIX / Windows文本编码问题,或者有一些UNIX颜色代码不能正确解析。 我之前已经看到过 – 通常在Unix / Linux上没有颜色支持的旧shell中,或者Cygwin shell被引入到一个调用旧的c-shell终端的UNIX机器中(我们运行一些非常旧的Solaris 8机器 – BARF)。

我不确定这是否有帮助,但也许给你一些想法。