Java 有趣的Shell输出:[01;32mtestfile.txt[00m,而不是testfile.txt
问题:我从使用时发送的命令中获得“有趣”的字符输出,我想知道如何获得PuTTY会话中看到的常规输出 “有趣”是指我应该看到: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)
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()?可能值得发布一个链接到一个独立的最小示例来重现问题,而不是像上面那样的不完整摘录。这里有一个解决方案:玩得开心:)