【问题标题】:Returning Shell return values using sshj使用 sshj 返回 Shell 返回值
【发布时间】:2011-10-10 15:46:19
【问题描述】:

我正在使用 sshj 连接到远程机器以检索各种值。正如我在 sshj 中所了解的,当我执行以下代码来检索远程机器的主机名时:

SSHClient sshClient = new SSHClient();
Session session = sshClient.startSession();
Command commandObject = session.exec("hostname");

我知道我可以通过抓取输入流来检索返回值

session.getInputStream();

我似乎遇到的问题是,会话对象(和命令)被设计为“一次性使用”的方式。因此,考虑到这一点,我想在完成会话后关闭会话以清理资源,即

commandObject.close();

但是,由于 sshj 的异步特性,我无法确定输入流中何时有返回值可用,因为似乎没有内置任何回调功能。

我能想到的解决此问题的唯一方法是在检查输入流之前休眠一段预定义的时间。但是我觉得这只是一个 hack,我希望有更好的解决方案。

有没有人在使用 sshj 时遇到过类似的问题?有什么可能的解决方案?

干杯!

【问题讨论】:

    标签: java ssh sshj


    【解决方案1】:

    您可以在 Session 对象上调用 join(),当命令退出时,此方法将返回(或者如果超时到期)。然后您可以使用 getExitCode() -> Integer 检查退出代码,如果没有收到退出代码,则可能为 null。

    编辑:返回值是指命令生成的输出吗? getInputStream() 或 getErrorStream() 返回的 InputStream 实现了 available() 方法,因此您可以基于它实现解决方案。

    【讨论】:

    • 是的,我可以通过输入流获取返回值。但是,似乎没有一种干净的方法可以知道何时可以从 InputStream 中读取任何信息。由于 InputStream.available() 仅返回要读取的可用字节数。我也无法知道该命令是否,1) 没有合法地写入 IS,因为命令没有生成输出,2) 由于延迟而没有写入 IS,但预计将来会,或者3) 更糟糕的是,仅部分写入 IS。
    • 一旦你在 Session 上“加入”,命令就完成了,所以你确定 2) 和 3) 没有发生,因为你执行的命令已经完成。所以你总是在 1)。
    • 它们是一样的。查看 SessionChannel.exec 的源代码
    猜你喜欢
    • 2019-09-16
    • 2011-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-25
    • 1970-01-01
    • 2011-02-24
    相关资源
    最近更新 更多