Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用sshj返回Shell返回值_Java_Ssh_Sshj - Fatal编程技术网

Java 使用sshj返回Shell返回值

Java 使用sshj返回Shell返回值,java,ssh,sshj,Java,Ssh,Sshj,我使用sshj连接到远程机器以检索各种值。正如我在sshj中所理解的,当我执行以下代码来检索远程机器的主机名时: SSHClient sshClient = new SSHClient(); Session session = sshClient.startSession(); Command commandObject = session.exec("hostname"); 我知道我可以通过获取inputstream来检索返回值 session.getInputStream(); 我似乎遇

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

SSHClient sshClient = new SSHClient();
Session session = sshClient.startSession();
Command commandObject = session.exec("hostname");
我知道我可以通过获取inputstream来检索返回值

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

commandObject.close();
但是,由于sshj的异步特性,我无法确定inputstream中何时有返回值可用,因为似乎没有内置任何回调功能

我能想到的解决这个问题的唯一方法是在检查inputstream之前先休眠一段预定义的时间。然而,我觉得这仅仅是一个黑客,我希望有一个更好的解决方案来解决这一切

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

干杯

您可以对会话对象调用join(),当命令退出时,此方法将返回(或者如果超时过期)。然后,您可以使用getExitCode()->Integer检查退出代码,如果没有收到退出代码,该整数可能为空


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

是的,我可以通过InputStream获取返回值。然而,似乎没有一种干净的方法可以知道何时有任何信息可以从InputStream读取。因为InputStream.available()只返回要读取的可用字节数。我无法知道该命令是否已合法写入is,1)由于没有命令生成的输出,2)由于延迟而未写入is,但预计将来会写入,或3)更糟的是,仅部分写入is。一旦您在会话上“加入”,该命令即已完成,因此,您确信2)和3)没有发生,因为您执行的命令已经完成。所以你总是在1),他们是一样的。请参阅SessionChannel.exec的源代码