通过Java实现bash命令过程解析

这篇文章主要介绍了通过Java实现bash命令过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

1、BASH 命令简介

Bash,Unix shell的一种,在1987年由布莱恩·福克斯为了GNU计划而编写。1989年发布第一个正式版本,原先是计划用在GNU操作系统上,但能运行于大多数类Unix系统的操作系统之上,包括Linux与Mac OS X v10.4都将它作为默认shell。

Bash是Bourne shell的后继兼容版本与开放源代码版本,它的名称来自Bourne shell(sh)的一个双关语(Bourne again / born again):Bourne-Again SHell。

Bash是一个命令处理器,通常运行于文本窗口中,并能执行用户直接输入的命令。Bash还能从文件中读取命令,这样的文件称为脚本。和其他Unix shell 一样,它支持文件名替换(通配符匹配)、管道here文档、命令替换、变量,以及条件判断和循环遍历的结构控制语句。包括关键字、语法在内的基本特性全部是从sh借鉴过来的。其他特性,例如历史命令,是从cshksh借鉴而来。总的来说,Bash虽然是一个满足POSIX规范的shell,但有很多扩展。

2、Java实现 BASH命令执行Shell脚本

1)代码实现如下:

import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.Session;
import ch.ethz.ssh2.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;
    }
  }

  /**
   * 创建连接并认证
   * @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();
    }
  }

  /**
   * 执行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("执行的结果如下: \n" + result.toString());
  }
}

2)执行结果如下:

执行的结果如下:
/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-ssh2</artifactId>
      <version>262</version>
    </dependency>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • bash脚本中将密码传递给ssh/scp命令方法详解

    安装SSHPASS 对于大多数最新的操作系统,sshpass软件包在默认软件包存储库中可用.可以使用以下命令在系统上安装它. 在Debian上: $ sudo apt install sshpass 在CentOS上: $ yum --enablerepo = epel -y install sshpass 使用SSHPASS sshspass使用sshspass环境变量存储用户密码.需要首先使用sshspass变量和密码,然后使用此命令.下面是一个使用sshspass的简单shell脚本. e

  • Bash 脚本实现每次登录到 Shell 时可以查看 Linux 系统信息

    Linux 中有很多可以查看系统信息如处理器信息.生产商名字.序列号等的命令.你可能需要执行多个命令来收集这些信息.同时,记住所有的命令和他们的选项也是有难度. 你可以写一个 shell 脚本 基于你的需求来自定义显示的信息. 以前我们出于不同的目的需要写很多个 bash 脚本. 现在我们写一个新的 shell 脚本,在每次登录到 shell 时显示需要的系统信息. 这个j脚本有 6 部分,细节如下: 通用系统信息 CPU/内存当前使用情况 硬盘使用率超过 80% 列出系统 WWN 详情 Ora

  • 在Bash脚本中创建和使用数组方法总结

    在Bash中定义一个数组 有两种方法可以在bash脚本中创建新数组.第一个是使用declare命令来定义一个Array.此命令将定义名为test_array的关联数组. $ declare -a test_array 还可以通过分配元素来创建数组. $ test_array=(apple orange lemon) 访问数组元素 与其他编程语言类似,bash数组元素可以使用索引号从0开始,然后从1.2.3-n开始访问.这也适用于索引号为数字的关联数组. $ echo ${test_array[0

  • bash命令使用详解

    在Linux上采用bash作为标准,基本上它描述了对带有".sh"扩展名的vi编辑器等文本的处理并执行. 与编程一样,它有许多函数,如变量,函数和算术处理,所以如果你是一个小程序,你可以用bash编写它. 此外,由于bash是由shell执行的,因此它也称为shell脚本. 创建一个shell脚本 我们首先创建一个简单的脚本,将"Hello World !!"输出到控制台. 使用vi命令创建新文件. $ vi hello.sh 打开编辑器后,按如下所示编写. #!/

  • Java代码执行shell命令的实现

    本文描述两种方式使用java代码执行shell命令,首先使用Runtime类调用exce方法,其次使用ProcessBuilder实例实现更灵活的方式. 1. 环境准备 执行shell命令之前,我们需要获取jvm底层操作系统,同时定义通用消费流的类. 1.1. 操作系统依赖 在创建进场执行shell命令之前,我们需要获取jvm运行在具体哪个操作系统之上.因为Windows执行shell命令是cmd.exe,而其他操作系统发布标准shell是sh: boolean isWindows = Syst

  • 深入理解Bash中的尖括号(适合初学者)

    前言 Bash 内置了很多诸如 ls.cd.mv 这样的重要的命令,也有很多诸如 grep.awk.sed 这些有用的工具.但除此之外,其实 Bash 中还有很多可以起到胶水作用的标点符号,例如点号(.).逗号(,).括号(<>).引号(")之类.下面我们就来看一下可以用来进行数据转换和转移的尖括号(<>). 转移数据 如果你对其它编程语言有所了解,你会知道尖括号 < 和 > 一般是作为逻辑运算符,用来比较两个值之间的大小关系.如果你还编写 HTML,尖括号作

  • java调用shell命令并获取执行结果的示例

    使用到Process和Runtime两个类,返回值通过Process类的getInputStream()方法获取 package ark; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; public class ReadCmdLine { public st

  • Python3 执行Linux Bash命令的方法

    和之前C++执行Linux Bash命令的方法 一样,Python依然支持system调用和popen()函数来执行linux bash命令. 方法一:system调用 #仅仅在一个子终端运行系统命令,而不能获取命令执行后的返回信息 import os os.system('ls') 方法二:popen()函数 import os os.popen('ls').readlines() #这个返回值是一个list 方法三:使用模块 subprocess import subprocess subp

  • Java简单实现调用命令行并获取执行结果示例

    本文实例讲述了Java简单实现调用命令行并获取执行结果.分享给大家供大家参考,具体如下: import java.io.BufferedReader; import java.io.InputStreamReader; public class Command { public static void exeCmd(String commandStr) { BufferedReader br = null; try { Process p = Runtime.getRuntime().exec(

  • 通过Java实现bash命令过程解析

    这篇文章主要介绍了通过Java实现bash命令过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.BASH 命令简介 Bash,Unix shell的一种,在1987年由布莱恩·福克斯为了GNU计划而编写.1989年发布第一个正式版本,原先是计划用在GNU操作系统上,但能运行于大多数类Unix系统的操作系统之上,包括Linux与Mac OS X v10.4都将它作为默认shell. Bash是Bourne shell的后继兼容版本与开放

  • 基于Java实现ssh命令登录主机执行shell命令过程解析

    这篇文章主要介绍了基于Java实现ssh命令登录主机执行shell命令过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.SSH命令 SSH 为 Secure Shell的缩写,由 IETF 的网络小组(Network Working Group)所制定:SSH 为建立在应用层基础上的安全协议.SSH 是较可靠,专为远程登录会话和其他网络服务提供安全性的协议.利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题.SSH最初是UNI

  • 原生Java操作mysql数据库过程解析

    这篇文章主要介绍了原生Java操作mysql数据库过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.引入数据库驱动的jar包 以通过maven引入mysql driver为例 1.1 到http://mvnrepository.com 搜索 mysql 1.2 复制所需maven配置文件到工程的 pom.xml <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-

  • Java继承构造器使用过程解析

    这篇文章主要介绍了Java继承构造器使用过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 初始化基类 前面提到,继承是子类对父类的拓展.<Thinking in Java>中提到下面一段话: 当创建一个导出类的对象时,该对象包含了一个基类的子对象.这个子对象与你用基类直接创建的对象是一样的.二者区别在于,后者来自于外部,而基类的子对象被包装在导出类的对象内部. 我们在创建子类对象时,调用了父类的构造器,甚至父类的父类构造器.我们知道,构

  • JAVA如何定义构造函数过程解析

    这篇文章主要介绍了JAVA如何定义构造函数过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 构造函数在类里面定义,构造函数名一定要跟类名相同,实例化一个对象的时候,如果没有初始化成员变量,可以不用定义构造函数,系统会自己定义好,定义了也不会影响.如果实例化对象需要初始化成员变量就一定自定义构造函数. 定义构造函数 class Cat { String name; int age; //可定义可不定义,不定义时实例化一个对象会自动定义这个构

  • 如何通过Java实现时间轴过程解析

    这篇文章主要介绍了如何通过Java实现时间轴过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.需要添加FastJson的依赖处理数据. <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.47</version> </depen

  • 使用maven插件对java工程进行打包过程解析

    现在基本上都是采用maven来进行开发管理,我有一个需求是需要把通过maven管理的java工程打成可执行的jar包,这样也就是说必需把工程依赖的jar包也一起打包.而使用maven默认的package命令构建的jar包中只包括了工程自身的class文件,并没有包括依赖的jar包.我们可以通过配置插件来对工程进行打包,pom具体配置如下: maven-assembly-plugin <plugin> <artifactId>maven-assembly-plugin</art

  • MAC配置java+jmeter环境变量过程解析

    打开ITerm终端 进入命令输入,sudo su,输入密码 创建.bash_profile文件touch .bash_profile 打开.bash_profile文件open .bash_profile 弹出文本编辑 export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-14.0.1.jdk/Contents/Home export PATH=$JAVA_HOME/bin:$PATH export CLASSPATH=.:$JAVA_HO

  • 如何基于java实现Gauss消元法过程解析

    补充知识: 正定矩阵 奇异矩阵 严格对角占优 要理解Gauss消去法,首先来看一个例子: 从上例子可以看出,高斯消去法实际上就是我们初中学的阶二元一次方程组,只不过那里的未知数个数$n=2$ $n>2$时,Gauss消去法的思路实际上和解二元一次方程组是一样的,方法如下: 将n方程组中的n−1个方程通过消元,形成一个与原方程组等价的一个新方程组,新方程组中的n−1个方程仅包含n−1个未知数. 故问题就转化为了求解n−1元的方程组,这样我们可以继续消元,以次类推,直到最后一个方程组为一元一次方程组

  • Java 图片复制功能实现过程解析

    需求说明 实现思路 见代码注释 代码内容 使用IO复制图片 import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; /** * @auther::9527 * @Description: 第十题 * @program: 多线程 * @create: 2019-08-10 00:26 */ pu

随机推荐