最近,需要開發一個Web管理系統,通過Web控制來執行遠程Linux主機上的服務指令碼,參考了http://blog.csdn.net/sheismylife/archive/2009/11/17/4823696.aspx使用的一個小工具,確實很好地解決了這個問題,做個記錄,以供查閱。
這個小工具打成一個jar檔案:ganymed-ssh2-build210.jar,可以在http://www.ganymed.ethz.ch/ssh2/處下載。該工具是基於SSH2協議的實現,在使用它的過程中非常容易,只需要指定合法的使用者名稱口令,或者授權認證檔案,就可以建立到遠程Linux主機的串連,在建立起來的會話中調用該Linux主機上的指令檔,執行相關操作。
下面是我基於ganymed-ssh2-build210.jar庫,寫的一個Demo,代碼如下所示:
package org.shirdrn.shell;
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;
import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.Session;
/**
* 遠程Shell指令碼執行工具
*
* @author Administrator
*/
public class RemoteShellTool {
private Connection conn;
private String ipAddr;
private String charset = Charset.defaultCharset().toString();
private String userName;
private String password;
public RemoteShellTool(String ipAddr, String userName, String password, String charset) {
this.ipAddr = ipAddr;
this.userName = userName;
this.password = password;
if(charset != null) {
this.charset = charset;
}
}
/**
* 登入遠程Linux主機
*
* @return
* @throws IOException
*/
public boolean login() throws IOException {
conn = new Connection(ipAddr);
conn.connect(); // 串連
return conn.authenticateWithPassword(userName, password); // 認證
}
/**
* 執行Shell指令碼或命令
*
* @param cmds 命令列序列
* @return
*/
public String exec(String cmds) {
InputStream in = null;
String result = "";
try {
if (this.login()) {
Session session = conn.openSession(); // 開啟一個會話
session.execCommand(cmds);
in = session.getStdout();
result = this.processStdout(in, this.charset);
conn.close();
}
} catch (IOException e1) {
e1.printStackTrace();
}
return result;
}
/**
* 解析流擷取字串資訊
*
* @param in 輸入資料流對象
* @param charset 字元集
* @return
*/
public String processStdout(InputStream in, String charset) {
byte[] buf = new byte[1024];
StringBuffer sb = new StringBuffer();
try {
while (in.read(buf) != -1) {
sb.append(new String(buf, charset));
}
} catch (IOException e) {
e.printStackTrace();
}
return sb.toString();
}
}
需要說明的一點是,執行指令碼以後,可以擷取指令碼執行的結果文本,需要對這些文本進行正確編碼後返回給用戶端(我們的Web管理主控台),才能看到實際指令碼執行的結果。
另外,當執行login方法時,登入成功,位於當前的***.***.***.***:/home/username/目錄之下,你可以指定指令檔所在的絕對路徑,或者通過cd導航到指令檔所在的目錄,然後傳遞執行指令碼所需要的參數,完成指令碼調用執行。
http://hi.baidu.com/shirdrn/blog/item/59223b129a7322c5c3fd78a9.html