溫馨提示×

溫馨提示×

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

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

如何通過Java實(shí)現(xiàn)bash命令過程解析

發(fā)布時間:2021-09-27 09:29:38 來源:億速云 閱讀:164 作者:小新 欄目:編程語言

小編給大家分享一下如何通過Java實(shí)現(xiàn)bash命令過程解析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

1、BASH 命令簡介

Bash,Unix shell的一種,在1987年由布萊恩·福克斯為了GNU計(jì)劃而編寫。1989年發(fā)布第一個正式版本,原先是計(jì)劃用在GNU操作系統(tǒng)上,但能運(yùn)行于大多數(shù)類Unix系統(tǒng)的操作系統(tǒng)之上,包括Linux與Mac OS X v10.4都將它作為默認(rèn)shell。

Bash是Bourne shell的后繼兼容版本與開放源代碼版本,它的名稱來自Bourne shell(sh)的一個雙關(guān)語(Bourne again/ born again):Bourne-AgainSHell。

Bash是一個命令處理器,通常運(yùn)行于文本窗口中,并能執(zhí)行用戶直接輸入的命令。Bash還能從文件中讀取命令,這樣的文件稱為腳本。和其他Unix shell 一樣,它支持文件名替換(通配符匹配)、管道、here文檔、命令替換、變量,以及條件判斷和循環(huán)遍歷的結(jié)構(gòu)控制語句。包括關(guān)鍵字、語法在內(nèi)的基本特性全部是從sh借鑒過來的。其他特性,例如歷史命令,是從csh和ksh借鑒而來??偟膩碚f,Bash雖然是一個滿足POSIX規(guī)范的shell,但有很多擴(kuò)展。

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

1)代碼實(shí)現(xiàn)如下:

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)建連接并認(rèn)證   * @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;    }  }  /**   * 關(guān)閉連接   */  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";  // 此處根據(jù)實(shí)際情況,換成自己需要訪問的主機(jī)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í)行的結(jié)果如下: \n" + result.toString());  }}

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

執(zhí)行的結(jié)果如下:/home/miracleluna.txtHello, 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>

以上是“如何通過Java實(shí)現(xiàn)bash命令過程解析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

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

AI