Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.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运行UNIX Shell脚本时的实时控制台输出(实时输出)_Java_Shell_Unix_Ssh_Jsch - Fatal编程技术网

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

从Java运行UNIX Shell脚本时的实时控制台输出(实时输出),java,shell,unix,ssh,jsch,Java,Shell,Unix,Ssh,Jsch,要求是在UI上向用户显示脚本执行输出的实时流 我有一个unixshell脚本,它有多个命令,中间有sleep命令。我需要在从Java执行每个命令之后读取控制台输出 我使用JSCH(JCraft)连接到UNIX服务器并运行Shell脚本。我能够在执行完整的脚本后获得控制台输出。但每次执行命令后都无法获取 下面是一个UNIX Shell脚本: #!/bin/bash echo "Executing touch ChaosMonkey" sleep 5 echo "Connection and Ex

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

我有一个unixshell脚本,它有多个命令,中间有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

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

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

下面是一段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();
channel=session.openChannel(“exec”);
setCommand(“bash/tmp/temp.sh”);
channel.setInputStream(空);
channel.setOutputStream(系统输出);
InputStream out=channel.getInputStream();
channel.connect();
StringBuilder outputBuffer=新的StringBuilder();
字节[]tmp=新字节[1024];
while(true){
while(out.available()>0){
inti=out.read(tmp,0,1024);
if(i<0)
打破
append(新字符串(tmp,0,i));
}
if(channel.isEOF()){
打破
}
}
System.out.println(“控制台输出::::”+outputBuffer.toString());
System.out.println(“通道出口状态:+Channel.getExitStatus());
通道断开();

请同时发布Java代码。此代码段仅在退出while循环后打印控制台输出。它在这个问题上做的并不是你想要的。要让它显示在用户界面上,需要做更多的事情。在获得这些实时日志之后,您可以将其保存到任何集合中,并使用事件发射器钩住它,事件发射器将持续将这些日志发送到UI应用程序,UI应用程序将通过web套接字监听这些日志。我已经实现了端到端的东西,项目在github上可用。检查Resilience studio代理文件夹。