小編給大家分享一下如何通過Java實(shí)現(xiàn)bash命令過程解析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!
創(chuàng)新互聯(lián)是一家專注于成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站、成都外貿(mào)網(wǎng)站建設(shè)公司與策劃設(shè)計(jì),古雷港網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)十余年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:古雷港等地區(qū)。古雷港做網(wǎng)站價(jià)格咨詢:18980820575
1、BASH 命令簡(jiǎn)介
Bash,Unix shell的一種,在1987年由布萊恩·福克斯為了GNU計(jì)劃而編寫。1989年發(fā)布第一個(gè)正式版本,原先是計(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)的一個(gè)雙關(guān)語(Bourne again/ born again):Bourne-AgainSHell。
Bash是一個(gè)命令處理器,通常運(yùn)行于文本窗口中,并能執(zhí)行用戶直接輸入的命令。Bash還能從文件中讀取命令,這樣的文件稱為腳本。和其他Unix shell 一樣,它支持文件名替換(通配符匹配)、管道、here文檔、命令替換、變量,以及條件判斷和循環(huán)遍歷的結(jié)構(gòu)控制語句。包括關(guān)鍵字、語法在內(nèi)的基本特性全部是從sh借鑒過來的。其他特性,例如歷史命令,是從csh和ksh借鑒而來??偟膩碚f,Bash雖然是一個(gè)滿足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 Listcommand(String command) { if (conn == null && !connection()) { logger.error("Authentication failed."); return null; } List result = new ArrayList (); 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 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引用依賴包如下:
org.slf4j slf4j-api 1.7.21 ch.ethz.ganymed ganymed-ssh3 262
以上是“如何通過Java實(shí)現(xiàn)bash命令過程解析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!