java jsch 调用shell_Java-Jsch-Shell脚本执行后退出
时间: 2023-09-08 20:16:51 浏览: 163
您好!针对您的问题,我可以给出以下解答:
Java JSch 是一个用于远程执行命令和传输文件的 Java 库,通过 JSch,我们可以在 Java 应用程序中连接到远程主机,并执行远程主机上的命令。
针对您的问题,如果您在使用 Java JSch 调用 shell 脚本时,脚本执行后立即退出,可能是因为您的 Java 程序没有等待 shell 脚本执行完毕就立即退出了。
为了解决这个问题,您可以在调用 shell 脚本的代码中,使用 `ChannelExec.setPty(true)` 方法启用伪终端模式,并使用 `ChannelExec.setCommand(command + ";echo finished")` 方法在 shell 脚本执行完毕后输出一个 "finished" 的标识符。然后您可以使用 `ChannelExec.getInputStream()` 方法获取 shell 脚本的输出流,并等待输出流中包含 "finished" 标识符,表示 shell 脚本已经执行完毕,然后再关闭连接。
以下是一个示例代码:
```
JSch jsch = new JSch();
Session session = jsch.getSession(username, host, port);
session.setPassword(password);
session.setConfig("StrictHostKeyChecking", "no");
session.connect();
ChannelExec channelExec = (ChannelExec) session.openChannel("exec");
channelExec.setPty(true);
channelExec.setCommand(command + ";echo finished");
channelExec.setInputStream(null);
channelExec.setErrStream(System.err);
InputStream inputStream = channelExec.getInputStream();
channelExec.connect();
byte[] tmp = new byte[1024];
while (true) {
while (inputStream.available() > 0) {
int i = inputStream.read(tmp, 0, 1024);
if (i < 0) break;
System.out.print(new String(tmp, 0, i));
}
if (channelExec.isClosed()) {
if (inputStream.available() > 0) continue;
System.out.println("exit-status: " + channelExec.getExitStatus());
break;
}
try { Thread.sleep(1000); } catch (Exception ee) {}
}
channelExec.disconnect();
session.disconnect();
```
希望这个解答能够帮到您!
阅读全文