首發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端就認為是一條完整命令了。很奇怪的特性!
-----------------------------------------------
附上類代碼