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

 更新时间:2020年01月14日 09:46:34   作者:龙凌云端  
这篇文章主要介绍了通过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>

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

相关文章

  • java中关于Map的三种遍历方法详解

    java中关于Map的三种遍历方法详解

    本篇文章是对java中关于Map的三种遍历方法进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • Java中Maven的依赖管理问题小结

    Java中Maven的依赖管理问题小结

    这篇文章主要介绍了Java中Maven的依赖管理,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-05-05
  • 使用SQL保留两位小数的实现方式

    使用SQL保留两位小数的实现方式

    SQL中保留两位小数有三种方法:1、使用ROUND()函数进行四舍五入;2、使用CONVERT()函数和3、CAST()函数进行强制类型转换,这两种方法会截断多余的位数,ROUND()函数会保留0位,而CONVERT()和CAST()会删除多余的0
    2024-11-11
  • Springboot的maven间接依赖的实现

    Springboot的maven间接依赖的实现

    这篇文章主要介绍了Springboot的maven间接依赖的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05
  • Arthas排查Kubernetes中应用频繁挂掉重启异常

    Arthas排查Kubernetes中应用频繁挂掉重启异常

    这篇文章主要为大家介绍了Arthas排查Kubernetes中应用频繁挂掉重启的异常分析,有需要的朋友可以借鉴参考下,希望能够有所帮助祝大家多多进步
    2022-02-02
  • Java面向接口编程之简单工厂模式示例

    Java面向接口编程之简单工厂模式示例

    这篇文章主要介绍了Java面向接口编程之简单工厂模式,结合实例形式详细分析了java面向接口编程简单工厂模式的具体定义与使用方法,需要的朋友可以参考下
    2019-09-09
  • java集合类arraylist循环中删除特定元素的方法

    java集合类arraylist循环中删除特定元素的方法

    下面小编就为大家带来一篇Java集合类ArrayList循环中删除特定元素的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-11-11
  • Java concurrency集合之LinkedBlockingDeque_动力节点Java学院整理

    Java concurrency集合之LinkedBlockingDeque_动力节点Java学院整理

    LinkedBlockingDeque是双向链表实现的双向并发阻塞队列。该阻塞队列同时支持FIFO和FILO两种操作方式,即可以从队列的头和尾同时操作(插入/删除);并且,该阻塞队列是支持线程安全。
    2017-06-06
  • Java线程间共享与协作详细介绍

    Java线程间共享与协作详细介绍

    这篇文章主要介绍了Java线程间共享与协作详细介绍,Java 支持多个线程同时访问一个对象或者对象的成员变量,更多相关介绍需要的朋友可以参考一下
    2022-09-09
  • 解决mybatis #{}无法自动添加引号的错误

    解决mybatis #{}无法自动添加引号的错误

    这篇文章主要介绍了解决mybatis #{}无法自动添加引号的错误,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-01-01

最新评论