【发布时间】:2013-06-27 09:01:57
【问题描述】:
我正在使用漂亮的 http://www.jcraft.com/jsch/ 库 - 但是当我运行一些命令时,我看到 jsch 不时返回 -1 的 getExitStatus,即使脚本运行良好(当我手动运行它时)始终是成功的 0 退出代码)。有什么想法吗?
(似乎发生在各种各样的命令上)
【问题讨论】:
我正在使用漂亮的 http://www.jcraft.com/jsch/ 库 - 但是当我运行一些命令时,我看到 jsch 不时返回 -1 的 getExitStatus,即使脚本运行良好(当我手动运行它时)始终是成功的 0 退出代码)。有什么想法吗?
(似乎发生在各种各样的命令上)
【问题讨论】:
我放弃了 Jsch - 以及它非常无用的 API,并转而使用:
http://www.cleondris.ch/opensource/ssh2/
(Ganymede SSH2)。 我在 JVM 中使用 ssh 做了很多事情,并且几个月来 24 小时使用 ganymede 已被证明更加可靠。而且更愉快。我剩下的主要抱怨是显然无法为 SCP 设置超时。
【讨论】:
我遇到了同样的问题,然后在 Jsch 更改日志 (http://www.jcraft.com/jsch/ChangeLog) 中遇到了这个问题:
- 功能:添加了“Channel.isClosed()”。 Channel.getExitStatus() 应该是 在 Channel.isClosed()==true 之后调用。
所以把这个搞砸了:需要在 channel.disconnect() 之前调用,否则仍然会得到 -1 问题:
private static void waitForChannelClosure(ChannelExec ce, long maxwaitMs) {
log.info("waitForChannelClosure >>>");
final long until = System.currentTimeMillis() + maxwaitMs;
try {
while (!ce.isClosed() && System.currentTimeMillis() < until) {
log.info("SFTP channel not closed .. waiting");
Thread.sleep(250);
}
} catch (InterruptedException e) {
throw new RuntimeException("Interrupted", e);
}
if (!ce.isClosed()) {
throw new RuntimeException("Channel not closed in timely manner!");
}
};
【讨论】: