2011-10-10 203 views
1

我使用sshj连接到远程计算机以检索各种值。正如我在sshj明白,当我执行下面的代码检索远程机器的主机名:使用sshj返回Shell返回值

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

我知道,我可以抓住的InputStream

session.getInputStream(); 

问题检索的返回值我似乎拥有的是,会话对象(和命令)被设计成“一次又一次使用”的时尚。因此,考虑到这一点,我想一旦我用完后清理资源,关闭会话,即

commandObject.close(); 

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

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

有没有人有任何类似的问题使用sshj?有任何可能的解决方案

干杯!

回答

0

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

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

+0

是的,我能够通过输入流得到返回值。然而,看起来并不是一个干净的方式来知道什么时候从InputStream读取任何信息。由于InputStream.available()仅返回要读取的可用字节数。我没有办法知道命令是否1)合法地没有写入IS,因为没有命令产生输出,2)由于延迟而没有写入IS,但预计在未来,或者3)更糟的是,只有部分写给IS。 – scottsue

+0

一旦在会话中“加入”,该命令就完成了,因此您确定2)和3)没有发生,因为您执行的命令已完成。所以你总是在1)。 –

+0

好酷。感谢那。我会试一试 – scottsue