使用"更多"删除特殊字符使用JSCH从Java命令?

时间:2014-07-24 10:44:24

标签: java unix ssh jsch

我在UNIX服务器上有一个动态变化的日志文件。

我想构建一个应用程序,使用SSH在多个页面中使用Swings在Java GUI上查看该文件。

我正在使用JSCH Library执行"更多"该日志文件的命令。但在输出中,有一些特殊的字符,如' [24; 1H [K [7m'印刷。如何删除这些特殊字符。

我正在使用以下代码

session.setConfig("StrictHostKeyChecking", "no");   
session.connect(30000);
Channel channel=session.openChannel("shell");
channel.setInputStream(System.in);
channel.setOutputStream(System.out);            
channel.connect();           
Thread.sleep(3000);  
PrintStream ps = new PrintStream(channel.getOutputStream(), true);
ps.println("more " + fileName);

输出结果为:

[?7h[?1l(B=[24;1H[K************ Start Display Current Environment ************
[24;1H[K[7mSystemOut.log (0%)[m[24;1H[24;1H[KID: soacore.FP6123  BuildVrsn: null  Desc: WebSphere Process Server 6.1.2.3
[24;1H[K[7mSystemOut.log (0%)[m

如您所见,会打印一些特殊字符。如何删除这些特殊字符?

2 个答案:

答案 0 :(得分:1)

我找到了答案。只需一行代码即可。

((ChannelShell) channel).setPtyType("dumb");

在connect()之前添加上面的行会删除所有不可打印的字符。

答案 1 :(得分:0)

如果您正在开发终端模拟器,您可以考虑使用第三方库来帮助您管理输入数据流,特别是处理您遇到的the ANSI terminal control characters。像Expect这样的工具传统上用于自动化程序和基于文本的终端系统之间的交互。

您可以使用几种现有的Expect for Java实现。在这里,我想推广自己的名为ExpectIt的开源工具。它支持过滤输入数据,以删除您可能觉得对您的用例非常有用的终端控件等不需要的字符。它在项目页面上有其他优点。

以下是使用ExpectIt迭代more命令结果的示例。注意注册removeColors过滤器filters出终端字符。

    session.setConfig(config);
    session.connect();
    Channel channel = session.openChannel("shell");

    Expect expect = new ExpectBuilder()
            .withOutput(channel.getOutputStream())
            .withInputs(channel.getInputStream(), channel.getExtInputStream())
            // register filters to remove ANSI color characters
            .withInputFilters(removeColors())
            .build();
    try {
        channel.connect();
        // define the command line prompt
        final String PROMPT = "...";
        expect.expect(contains(PROMPT));
        expect.sendLine("more <file>");

        while (true) {
            // expect either the end of the page or the end of the command
            MultiResult result = expect.expect(anyOf(contains("--More--"), contains(PROMPT)));
            // print the result
            System.out.println(result.getBefore());
            // exit if reach the end
            if (result.getResults().get(1).isSuccessful()) {
                break;
            }
            // scroll to the next page
            expect.send(" ");
        }

下面的代码假定相应的方法是静态导入的。