1

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

“有趣”是指我应该看到这个:

testfile.txt

我看到了这个:

[01;32mtestfile.txt[00m

这类似于这个问题中的问题,除了答案不满足我的需要。答案是调用setPty(false)完全删除“伪终端”的 ChannelShell,但我需要实时从 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 ~]$然后执行这个:应该ls返回这个:testfile.txt但它返回的是这个:(注意:我不能复制和粘贴第一个字符,但它是一个字符代码为 27 的框我认为这是一个转义字符)。[01;32mtestfile.txt[00m

现在我通常会逃避这种事情,但我宁愿把它做​​好,而且似乎也有很多变种的怪异。所以我在这里。我希望你能帮忙:)

注意:我通过我的 IDE(一个 Eclipse 盗版)在我的 Windows 机器上运行它,但我尝试过调试,变量output实际上显示了“有趣”的字符。我也尝试过显示它JOptionPane.messageDialog只是为了确保它不仅仅是 IDE 并且它仍然具有字符。谢谢!

4

2 回答 2

3

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

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

这发生在所有命令上,还是仅发生在一些命令上?

打电话ChannelShell.setPtyType("dumb")也有帮助(未经测试)。您可能需要四处寻找禁用转义序列的终端类型。

有什么特殊原因是您使用 shellls而不是使用内置 Java 方法来检查目录内容吗?

于 2013-06-26T15:56:43.953 回答
0

这是在黑暗中拍摄的全部照片,但这看起来像是 UNIX/Windows 文本编码问题,或者可能有一些 UNIX 颜色代码没有被正确解析。我以前见过——通常是在没有颜色支持的 Unix/Linux 上的旧 shell 中,或者在 sshed 到调用旧 c-shell 终端的 UNIX 机器中的 Cygwin shell 中(我们运行一些非常旧的 Solaris 8 机器 -巴夫)。

我不确定这是否有帮助,但也许会给你一些思考。

于 2013-06-26T15:01:49.237 回答