Java調用遠程Shell指令碼(待驗證)

來源:互聯網
上載者:User

最近,需要開發一個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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.