2011-10-10 202 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