Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 有趣的Shell输出:[01;32mtestfile.txt[00m,而不是testfile.txt_Java_Linux_Ssh_Terminal_Jsch - Fatal编程技术网

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

Java 有趣的Shell输出:[01;32mtestfile.txt[00m,而不是testfile.txt,java,linux,ssh,terminal,jsch,Java,Linux,Ssh,Terminal,Jsch,问题:我从使用时发送的命令中获得“有趣”的字符输出,我想知道如何获得PuTTY会话中看到的常规输出 “有趣”是指我应该看到: testfile.txt 我看到了: [01;32mtestfile.txt[00m 这与中的问题类似,只是答案不满足我的需要。答案是在ChannelShell上调用setPty(false),这将完全删除“伪终端”,但我需要实时获得ChannelShell的输出。下面是我正在做的一个示例: ChannelShell channel = (ChannelShell)

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

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

testfile.txt
我看到了:

[01;32mtestfile.txt[00m
这与中的问题类似,只是答案不满足我的需要。答案是在ChannelShell上调用
setPty(false)
,这将完全删除“伪终端”,但我需要实时获得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);
}
ChannelShell channel=(ChannelShell)session.openChannel(“shell”);
channel.setOutputStream(新的打印流(
新ByteArrayOutputStream(),true,“UTF-8”){
@凌驾
公共无效写入(字节[]b,int off,int len){
超级。注销(b、off、len);
字符串输出=新字符串(b、off、len);
系统输出打印(输出);
sendNextCommand(output);//下一个命令的执行取决于此处的输出,这就是为什么我需要它不包含有趣的字符。
}
});
PipedInputStream in=新的PipedInputStream();
channelInput=新管道输出流(in);
通道设置输入流(in);
channel.connect();
而(!channel.isClosed()&&channelWaitRetries++
sendNextCommand方法用于检查输出是否与下一个命令执行时需要显示的内容相匹配[user@server ~]$然后执行这个:
ls
它应该返回这个:
testfile.txt
但是它返回这个:
[01;32mtestfile.txt[00m
(注意:我不能复制和粘贴第一个字符,但是它是一个字符代码为27的框,我认为它是一个转义字符)

现在我通常只想逃避这种事情,但我更愿意把它做好,而且这种怪诞似乎也有很多变体。所以我来了。我希望你能帮我:)


注意:我是通过我的IDE(eclipse翻版)在我的Windows机器上运行这个程序的,但我已经尝试过调试,变量
output
实际上显示了“搞笑”字符。我还尝试在
JOptionPane.messageDialog
中显示它,只是为了确保它不仅是IDE,而且还有字符。谢谢!

这完全是瞎猜,但这看起来像是UNIX/Windows文本编码问题,或者可能是一些UNIX颜色代码解析不正确。我以前见过这种情况——通常是在Unix/Linux上没有颜色支持的较旧shell中,或者在调用旧c-shell终端的Unix机器中使用Cygwin shell(我们运行一些非常旧的Solaris 8机器-barf)


我不确定这是否有帮助,但可能会给你一些想法。

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

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

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

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


有没有什么特别的原因让你不使用内置的Java方法来检查目录内容而使用shell
ls
呢?

我想大多数命令都是这样的。我没有尝试过很多命令,但我确实运行了运行多个命令的脚本,其中一些命令的输出包含了一些ANSI转义序列。它“dumb”似乎没有什么区别。我不确定我是否知道所有的终端类型。快速搜索将我带到我的
/etc/termcap
文件,它看起来像是一个“香草”我认为有希望的类型,但没有用。我是否缺少什么?设置
PtyType
似乎不起作用。是否在connect()之前调用setPtyType()?可能值得发布一个链接到一个独立的最小示例来重现问题,而不是像上面那样的不完整摘录。这里有一个解决方案:玩得开心:)