[原]使用Jsch執行Shell腳本


首發CSDN http://blog.csdn.net/basecn/archive/2010/12/16/6080741.aspx

作者:BaseCN Email:basecn@163.com

-----------------------------------------------

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

 

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

 

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

有兩個問題:

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

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

 

要是哪位知道exec如何解決上面現兩個問題,請分享一下!

-----------------------------------------------

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

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

輸出

為了得到腳本的運行結果,設置jsch的outputStream為FileOutputStream,把shell的輸出結果保存到本地文件。雖然最簡單的方式是設置System.out為jsch的OutputStream,在控制台看到結果,只是無法保存下來。

 

輸入

短時間運行的程序,輸入可以直接設置為System.in,而長期運行的程序不能使用人工方式輸入,必須由程序自動生成命令來執行。所以使用PipeStream來實現字符串輸入命令:

 

調用pipeOut.write( cmd.getBytes() );把生成的命令輸出給ssh。

運行

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

 

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

 

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

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

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

-----------------------------------------------

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

-----------------------------------------------

附上類代碼

 

 

 

作者:basecn 發表於2010-12-16 19:04:00 原文鏈接
閱讀:770 評論:1 查看評論


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM