栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何读取JSch命令输出?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何读取JSch命令输出?

在等待命令完成的同时,必须连续读取输出。否则,如果命令产生足够的输出以填充输出缓冲区,则该命令将挂起,等待缓冲区被消耗,这将永远不会发生。这样您就陷入僵局。

以下示例在监视命令状态的同时连续读取stdout和stderr。它基于官方的JSch

exec.java
示例
(仅添加了stderr的阅读)。

ChannelExec channel = (ChannelExec)session.openChannel("exec");channel.setCommand(    "for((i=1;i<=10000;i+=2)); do echo "Long output - $i"; done ; " +    "echo error output >&2");InputStream commandOutput = channel.getExtInputStream();StringBuilder outputBuffer = new StringBuilder();StringBuilder errorBuffer = new StringBuilder();InputStream in = channel.getInputStream();InputStream err = channel.getExtInputStream();channel.connect();byte[] tmp = new byte[1024];while (true) {    while (in.available() > 0) {        int i = in.read(tmp, 0, 1024);        if (i < 0) break;        outputBuffer.append(new String(tmp, 0, i));    }    while (err.available() > 0) {        int i = err.read(tmp, 0, 1024);        if (i < 0) break;        errorBuffer.append(new String(tmp, 0, i));    }    if (channel.isClosed()) {        if ((in.available() > 0) || (err.available() > 0)) continue;         System.out.println("exit-status: " + channel.getExitStatus());        break;    }    try {       Thread.sleep(1000);    } catch (Exception ee) {    }}System.out.println("output: " + outputBuffer.toString());System.out.println("error: " + errorBuffer.toString());channel.disconnect();

如果在

while (!channel.isClosed()) {}
之后添加
channel.connect();
,您会看到
i
shell
for
循环中有足够大的空间(在我的环境中,10000就足够了),循环永远不会结束。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/440398.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号