回覆列表
  • 1 # Java大資料佈道者

    1.匯入maven依賴jar包

    <dependency>

    <groupId>ch.ethz.ganymed</groupId>

    <artifactId>ganymed-ssh2</artifactId>

    <version>build210</version>

    </dependency>

    2.編輯相應Java程式碼

    package com.ksy.fw.base.util;

    import java.io.BufferedReader;

    import java.io.IOException;

    import java.io.InputStream;

    import java.io.InputStreamReader;

    import java.io.UnsupportedEncodingException;

    import org.apache.commons.lang.StringUtils;

    import ch.ethz.ssh2.Connection;

    import ch.ethz.ssh2.Session;

    import ch.ethz.ssh2.StreamGobbler;

    /**

    * 遠端執行linux的shell script

    */

    public class RemoteExecuteCommand {

    //字元編碼預設是utf-8

    private static String DEFAULTCHART="UTF-8";

    private Connection conn;

    private String ip;

    private String userName;

    private String userPwd;

    public RemoteExecuteCommand(String ip, String userName, String userPwd) {

    this.ip = ip;

    this.userName = userName;

    this.userPwd = userPwd;

    }

    public RemoteExecuteCommand() {

    }

    /**

    * 遠端登入linux的主機

    * @return

    * 登入成功返回true,否則返回false

    */

    public Boolean login(){

    boolean flg=false;

    try {

    conn = new Connection(ip);

    conn.connect();//連線

    flg=conn.authenticateWithPassword(userName, userPwd);//認證

    } catch (IOException e) {

    e.printStackTrace();

    }

    return flg;

    }

    /**

    * 遠端執行shll指令碼或者命令

    * @param cmd 即將執行的命令

    * @return 命令執行完後返回的結果值

    */

    public String execute(String cmd){

    String result="";

    try {

    if(login()){

    Session session= conn.openSession();//開啟一個會話

    session.execCommand(cmd);//執行命令

    result=processStdout(session.getStdout(),DEFAULTCHART);

    //如果為得到標準輸出為空,說明指令碼執行出錯了

    if(StringUtils.isBlank(result)){

    result=processStdout(session.getStderr(),DEFAULTCHART);

    }

    conn.close();

    session.close();

    }

    } catch (IOException e) {

    e.printStackTrace();

    }

    return result;

    }

    /**

    * 遠端執行shll指令碼或者命令

    * @param cmd 即將執行的命令

    * @return 命令執行成功後返回的結果值,如果命令執行失敗,返回空字串,不是null

    */

    public String executeSuccess(String cmd){

    String result="";

    try {

    if(login()){

    Session session= conn.openSession();//開啟一個會話

    session.execCommand(cmd);//執行命令

    result=processStdout(session.getStdout(),DEFAULTCHART);

    conn.close();

    session.close();

    }

    } catch (IOException e) {

    e.printStackTrace();

    }

    return result;

    }

    /**

    * 解析指令碼執行返回的結果集

    * @param in 輸入流物件

    * @param charset 編碼

    * @return 以純文字的格式返回

    */

    private String processStdout(InputStream in, String charset){

    InputStream stdout = new StreamGobbler(in);

    StringBuffer buffer = new StringBuffer();;

    try {

    BufferedReader br = new BufferedReader(new InputStreamReader(stdout,charset));

    String line=null;

    while((line=br.readLine()) != null){

    buffer.append(line+"\n");

    }

    } catch (UnsupportedEncodingException e) {

    e.printStackTrace();

    } catch (IOException e) {

    e.printStackTrace();

    }

    return buffer.toString();

    }

    public static void setCharset(String charset) {

    DEFAULTCHART = charset;

    }

    public Connection getConn() {

    return conn;

    }

    public void setConn(Connection conn) {

    this.conn = conn;

    }

    public String getIp() {

    return ip;

    }

    public void setIp(String ip) {

    this.ip = ip;

    }

    public String getUserName() {

    return userName;

    }

    public void setUserName(String userName) {

    this.userName = userName;

    }

    public String getUserPwd() {

    return userPwd;

    }

    public void setUserPwd(String userPwd) {

    this.userPwd = userPwd;

    }

    public static void main(String[] args) {

    RemoteExecuteCommand rec=new RemoteExecuteCommand("127.0.0.1", "root","root");

    //執行命令

    System.out.println(rec.execute("chmod 777 /usr/ksybak/myshell/tomcat-fw.sh"));

    System.out.println(rec.execute("/usr/ksybak/myshell/tomcat-fw.sh"));

    //System.out.println(rec.execute("/usr/ksybak/myshell/tomcat-fw.sh"));

    //執行指令碼

    //rec.execute("sh /usr/local/tomcat/bin/statup.sh");

    //這個方法與上面最大的區別就是,上面的方法,不管執行成功與否都返回,

    //這個方法呢,如果命令或者指令碼執行錯誤將返回空字串

    //System.out.println(rec.executeSuccess("ifconfig"));

    }

    }

  • 2 # 小小猿愛嘻嘻

    這個非常簡單,基本原理先透過ssh連線遠端Linux主機,然後執行shell命令,獲取返回結果,下面我簡單介紹一下實現過程,主要內容如下:

    1.首先,需要在maven中匯入程式所依賴的Jar包,這個直接在pom.xml檔案中輸入就行,如下:

    2.接著就可以用Java程式設計來實現遠端連線Linux主機並執行shell命令或指令碼了,主要步驟及截圖如下:

    首先,匯入程式所依賴的包,初始化成員變數,這裡定義了一個ExecuteShell類,建立物件時,需要輸入IP地址、使用者名稱和密碼這3個引數,用於後面ssh連線遠端Linux主機,程式碼如下,非常簡單:

    接著就是遠端連線Linux主機了,測試程式碼如下,很好理解,建立一個Connection連線,如果連線成功,則返回true,失敗則返回false:

    連線成功後,我們就可以直接執行Linux shell指令碼或命令了,測試程式碼如下,非常簡單,開啟一個Session會話,然後執行shell命令或指令碼,返回執行結果:

    processStdout函式程式碼如下,主要是取得shell命令和指令碼返回的結果,程式碼如下:

    最後,在main函式中建立ExecuteShell類物件,呼叫execute函式執行shell命令或指令碼就行,如下:

    至此,我們就完成了利用Java來遠端呼叫Linux命令或shell指令碼。總的來說,整個過程非常簡單,程式碼量也不多,很好理解,只要你有一定的Java基礎,熟悉一下上面的程式碼和示例,多除錯幾遍程式,很快就能掌握的,網上也有相關教程和資料,非常豐富詳細,感興趣的話,可以搜一下,希望以上分享的內容能對你有所幫助吧,也歡迎大家評論、留言進行補充。

  • 中秋節和大豐收的關聯?
  • 如果二戰中,德國不去進攻法國和蘇聯,法國、英國、美國、蘇聯與德國會處於什麼樣的關係?