从Java运行UNIX Shell脚本时的实时控制台输出(实时输出)

时间:2017-03-23 17:24:29

标签: java shell unix ssh jsch

要求是在UI上向用户显示脚本执行输出的实时流。

我有一个UNIX Shell脚本,其中包含多个带有sleep命令的命令。我需要在从Java执行每个命令后读取控制台输出。

我正在使用JSCH(JCraft)连接到UNIX服务器并运行Shell脚本。我可以在执行完整的脚本后获得控制台输出。但是在每次执行命令后都无法获得。

这是一个UNIX Shell脚本:

#!/bin/bash 
echo "Executing touch ChaosMonkey"
sleep 5
echo "Connection and Execution Successfully"
if [ $? = 0 ]
then
  echo "Monkey executed successfully"
else
  echo "Monkey execution returned with error" $?
fi

P.S。我不能使用文件方法,我可以将该o / p放入文件并通过其他SSH连接读取该文件。

1 个答案:

答案 0 :(得分:0)

以下是此问题的解决方案:

这是一段Java代码(JSCH)。在while循环中,您将收到实时控制台输出。

        channel=session.openChannel("exec");
        ((ChannelExec)channel).setCommand("bash /tmp/temp.sh");
        channel.setInputStream(null);
        channel.setOutputStream(System.out);
        InputStream out = channel.getInputStream();
        channel.connect();          
        StringBuilder outputBuffer = new StringBuilder();
        byte[] tmp = new byte[1024];

        while (true) {
            while (out.available() > 0) {
                int i = out.read(tmp, 0, 1024);
                if (i < 0)
                    break;
                outputBuffer.append(new String(tmp, 0, i));
            }
            if (channel.isEOF()) {
                break;
            }
        }
        System.out.println(" console output::::::::::: "+ outputBuffer.toString());
        System.out.println("Channel exit-status: " + channel.getExitStatus());
        channel.disconnect();