1. 程式人生 > >使用Jsch執行Shell命令

使用Jsch執行Shell命令

最近在寫一個監控方面的專案,總結一下Jsch的特性

Jsch是JAVA的SSH客戶端,使用的目的是執行遠端伺服器上的命令。

關於Session的使用,建立連線後這個session是一直可用的,所以不需要關閉。由Session中open的Channel在使用後應該關閉。

測試了exec的方式,具體參考jsch自帶example中的Exec.java。

有兩個問題:

1、無法執行多條命令,每次ChannelExec在connect前要先setCommand,最後一次的設定生效。

2、由於第一個原因的限制,如果執行的命令需要環境變數(如JAVA_HOME),就沒有辦法了。這種方式執行基本的ls,ps之類的命令沒有問題,需要複雜的環境變數時有點力不從心。

雖然exec可以得到命令的執行結果,但無法滿足應用,無奈之下放棄exec轉而使用ChannelShell。

在使用ChannelShell的時候需要特別關注jsch的輸入和輸出流的設定。

執行

jsch是以多執行緒方式執行的,所以程式碼在connect後如果不disconnect Channel和Session,以及相關的Stream,程式會一直等待,直到關閉,目前還沒有找到判斷關閉或主動關閉的方法,相信應該有這方面的機制。

要注意一個問題,相關的Stream和Channel是一定要關閉的,那麼應該在什麼時候來關。執行connect後,jsch接收客戶端結果需要一定的時間(以秒計),如果馬上關閉session就會發現什麼都沒接收到或內容不全。

可以採取兩個辦法來解決這個問題,一個開源一個節流

1、在connect增加一個等待延遲,等待1~2秒;

2、減小server端指令碼的執行時間,這個是節流。給命令加上"nohup XXXX > output &",以後臺方式執行,並把執行結果輸出到伺服器端的本地目錄下。這樣指令碼的執行時間可以是最小。

 

最後還有一點注意,使用shell時,看到有的朋友說執行後沒有結果。解決的辦法是在命令後加上"/n"字元,server端就認為是一條完整命令了。很奇怪的特性!