溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

通過Java實現bash命令過程解析

發(fā)布時間:2020-09-05 16:14:08 來源:腳本之家 閱讀:186 作者:龍凌云端 欄目:編程語言

這篇文章主要介紹了通過Java實現bash命令過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

1、BASH 命令簡介

Bash,Unix shell的一種,在1987年由布萊恩·??怂篂榱薌NU計劃而編寫。1989年發(fā)布第一個正式版本,原先是計劃用在GNU操作系統(tǒng)上,但能運行于大多數類Unix系統(tǒng)的操作系統(tǒng)之上,包括Linux與Mac OS X v10.4都將它作為默認shell。
Bash是Bourne shell的后繼兼容版本與開放源代碼版本,它的名稱來自Bourne shell(sh)的一個雙關語(Bourne again / born again):Bourne-Again SHell。
Bash是一個命令處理器,通常運行于文本窗口中,并能執(zhí)行用戶直接輸入的命令。Bash還能從文件中讀取命令,這樣的文件稱為腳本。和其他Unix shell 一樣,它支持文件名替換(通配符匹配)、管道、here文檔、命令替換、變量,以及條件判斷和循環(huán)遍歷的結構控制語句。包括關鍵字、語法在內的基本特性全部是從sh借鑒過來的。其他特性,例如歷史命令,是從csh和ksh借鑒而來。總的來說,Bash雖然是一個滿足POSIX規(guī)范的shell,但有很多擴展。

2、Java實現 BASH命令執(zhí)行Shell腳本

1)代碼實現如下:

import ch.ethz.ssh3.Connection;
import ch.ethz.ssh3.Session;
import ch.ethz.ssh3.StreamGobbler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;


public class BashUtil {

  private Logger logger = LoggerFactory.getLogger(BashUtil.class);

  private String hostname;

  private String username;

  private String password;

  private int port;

  private Connection conn;

  private BashUtil() {
  }

  public BashUtil(String hostname, String username, String password) {
    this(hostname, username, password, 22);
  }

  public BashUtil(String hostname, String username, String password, Integer port) {
    this.hostname = hostname;
    this.username = username;
    this.password = password;
    if (port == null) {
      port = 22;
    } else {
      this.port = port;
    }
  }

  /**
   * 創(chuàng)建連接并認證
   * @return
   */
  public Boolean connection() {
    try {
      conn = new Connection(hostname, port);
      conn.connect();
      boolean isAuthenticated = conn.authenticateWithPassword(username, password);
      return isAuthenticated;
    } catch (Exception e) {
      e.printStackTrace();
      return false;
    }
  }

  /**
   * 關閉連接
   */
  public void close() {
    try {
      conn.close();
      conn = null;
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  /**
   * 執(zhí)行shell命令
   * @param command
   * @return
   */
  public List<String> command(String command) {
    if (conn == null && !connection()) {
      logger.error("Authentication failed.");
      return null;
    }
    List<String> result = new ArrayList<String>();
    try {
      Session sess = conn.openSession();
      sess.execCommand(command);
      InputStream stdout = new StreamGobbler(sess.getStdout());
      InputStream stderr = new StreamGobbler(sess.getStderr());
      BufferedReader br_out = new BufferedReader(new InputStreamReader(stdout, "utf-8"));
      BufferedReader br_err = new BufferedReader(new InputStreamReader(stderr, "utf-8"));
      StringBuffer sb_err = new StringBuffer();
      String line = null;
      while ((line = br_out.readLine()) != null) {
        result.add(line.trim());
      }
      while ((line = br_err.readLine()) != null) {
        sb_err.append(line + "\n");
      }
      if (isNotEmpty(sb_err.toString())) {
        logger.error(sb_err.toString());
        return null;
      }
      return result;
    } catch (Exception e) {
      e.printStackTrace();
    }
    return null;
  }


  private static boolean isEmpty(String content) {
    if (content == null) {
      return true;
    } else {
      return "".equals(content.trim()) || "null".equalsIgnoreCase(content.trim());
    }
  }

  private static boolean isNotEmpty(String content) {
    return !isEmpty(content);
  }

  public static void main(String[] args){
    String hostname = "192.168.123.234";  // 此處根據實際情況,換成自己需要訪問的主機IP
    String userName = "root";
    String password = "password";
    Integer port = 22;
    String command = "cd /home/miracle&&pwd&&ls&&cat luna.txt";

    BashUtil bashUtil = new BashUtil(hostname, userName, password, port);
    List<String> resultList = bashUtil.command(command);
    StringBuffer result = new StringBuffer("");
    resultList.forEach(str -> result.append(str + "\n"));

    System.out.println("執(zhí)行的結果如下: \n" + result.toString());
  }
}

2)執(zhí)行結果如下:

執(zhí)行的結果如下: 
/home/miracle
luna.txt
Hello, I'm SshUtil.
Nice to meet you.^_^

3)pom.xml引用依賴包如下:

<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-api</artifactId>
      <version>1.7.21</version>
    </dependency>


    <!-- ssh -->
    <dependency>
      <groupId>ch.ethz.ganymed</groupId>
      <artifactId>ganymed-ssh3</artifactId>
      <version>262</version>
    </dependency>

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI