java - 使用 sshj 返回 Shell 返回值

标签 java ssh sshj

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

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

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

session.getInputStream();

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

commandObject.close();

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

我能想到解决此问题的唯一方法是在检查输入流之前 hibernate 预定的时间。然而我觉得这只是一个黑客,我希望有一个更好的解决方案来解决这一切。

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

干杯!

最佳答案

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

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

关于java - 使用 sshj 返回 Shell 返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7715344/

相关文章:

java - Neo4J 3.x 使用比 Neo4J 2.x 更多的内存?如何避免这种情况?

java - Java/Spring 中的全局状态

java - 与 Weblogic、JNDI 和 SSL 的自定义套接字连接

macos - 在远程机器 (Ubuntu) 上挂载本地目录 (Mac)

java - SSH 命令执行失败并出现异常 - "net.schmizz.sshj.connection.ConnectionException: Connection reset Exception is thrown"

java - BouncyCaSTLe 需要读取 ecdsa-sha2-nistp256 类型的 key

java - 使用本地锁代替共享锁进行同步安全吗?

powershell - 在 PowerShell 中回答 Plink 主机 key 和 KEX 提示

linux - 运行 Vagrant SSH 会导致 BASH 循环提前终止

java - 使用 Java SSH API 时 sqlplus 缺少输出