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)代码实现如下:

  1. import ch.ethz.ssh2.Connection;
  2. import ch.ethz.ssh2.Session;
  3. import ch.ethz.ssh2.StreamGobbler;
  4. import org.slf4j.Logger;
  5. import org.slf4j.LoggerFactory;
  6.  
  7. import java.io.BufferedReader;
  8. import java.io.InputStream;
  9. import java.io.InputStreamReader;
  10. import java.util.ArrayList;
  11. import java.util.List;
  12.  
  13. public class BashUtil {
  14.  
  15. private Logger logger = LoggerFactory.getLogger(BashUtil.class);
  16.  
  17. private String hostname;
  18.  
  19. private String username;
  20.  
  21. private String password;
  22.  
  23. private int port;
  24.  
  25. private Connection conn;
  26.  
  27. private BashUtil() {
  28. }
  29.  
  30. public BashUtil(String hostname, String username, String password) {
  31. this(hostname, username, password, 22);
  32. }
  33.  
  34. public BashUtil(String hostname, String username, String password, Integer port) {
  35. this.hostname = hostname;
  36. this.username = username;
  37. this.password = password;
  38. if (port == null) {
  39. port = 22;
  40. } else {
  41. this.port = port;
  42. }
  43. }
  44.  
  45. /**
  46. * 创建连接并认证
  47. * @return
  48. */
  49. public Boolean connection() {
  50. try {
  51. conn = new Connection(hostname, port);
  52. conn.connect();
  53. boolean isAuthenticated = conn.authenticateWithPassword(username, password);
  54. return isAuthenticated;
  55. } catch (Exception e) {
  56. e.printStackTrace();
  57. return false;
  58. }
  59. }
  60.  
  61. /**
  62. * 关闭连接
  63. */
  64. public void close() {
  65. try {
  66. conn.close();
  67. conn = null;
  68. } catch (Exception e) {
  69. e.printStackTrace();
  70. }
  71. }
  72.  
  73. /**
  74. * 执行shell命令
  75. * @param command
  76. * @return
  77. */
  78. public List<String> command(String command) {
  79. if (conn == null && !connection()) {
  80. logger.error("Authentication failed.");
  81. return null;
  82. }
  83. List<String> result = new ArrayList<String>();
  84. try {
  85. Session sess = conn.openSession();
  86. sess.execCommand(command);
  87. InputStream stdout = new StreamGobbler(sess.getStdout());
  88. InputStream stderr = new StreamGobbler(sess.getStderr());
  89. BufferedReader br_out = new BufferedReader(new InputStreamReader(stdout, "utf-8"));
  90. BufferedReader br_err = new BufferedReader(new InputStreamReader(stderr, "utf-8"));
  91. StringBuffer sb_err = new StringBuffer();
  92. String line = null;
  93. while ((line = br_out.readLine()) != null) {
  94. result.add(line.trim());
  95. }
  96. while ((line = br_err.readLine()) != null) {
  97. sb_err.append(line + "\n");
  98. }
  99. if (isNotEmpty(sb_err.toString())) {
  100. logger.error(sb_err.toString());
  101. return null;
  102. }
  103. return result;
  104. } catch (Exception e) {
  105. e.printStackTrace();
  106. }
  107. return null;
  108. }
  109.  
  110. private static boolean isEmpty(String content) {
  111. if (content == null) {
  112. return true;
  113. } else {
  114. return "".equals(content.trim()) || "null".equalsIgnoreCase(content.trim());
  115. }
  116. }
  117.  
  118. private static boolean isNotEmpty(String content) {
  119. return !isEmpty(content);
  120. }
  121.  
  122. public static void main(String[] args){
  123. String hostname = "192.168.123.234"; // 此处根据实际情况,换成自己需要访问的主机IP
  124. String userName = "root";
  125. String password = "password";
  126. Integer port = 22;
  127. String command = "cd /home/miracle&&pwd&&ls&&cat luna.txt";
  128.  
  129. BashUtil bashUtil = new BashUtil(hostname, userName, password, port);
  130. List<String> resultList = bashUtil.command(command);
  131. StringBuffer result = new StringBuffer("");
  132. resultList.forEach(str -> result.append(str + "\n"));
  133.  
  134. System.out.println("执行的结果如下: \n" + result.toString());
  135. }
  136. }

2)执行结果如下:

  1. 执行的结果如下:
  2. /home/miracle
  3. luna.txt
  4. Hello, I'm SshUtil.
  5. Nice to meet you.^_^

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

  1. <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
  2. <dependency>
  3. <groupId>org.slf4j</groupId>
  4. <artifactId>slf4j-api</artifactId>
  5. <version>1.7.21</version>
  6. </dependency>
  7.  
  8. <!-- ssh -->
  9. <dependency>
  10. <groupId>ch.ethz.ganymed</groupId>
  11. <artifactId>ganymed-ssh2</artifactId>
  12. <version>262</version>
  13. </dependency>

 PS:

Maven依赖jar包问题,请参考如下博文:

https://www.cnblogs.com/miracle-luna/p/11863679.html

Java 实现 bash命令
https://www.cnblogs.com/miracle-luna/p/12050728.html

Java 实现 ssh命令 登录主机执行shell命令
https://www.cnblogs.com/miracle-luna/p/12050367.html

Java 实现 telnet命令 验证主机端口的连通性
https://www.cnblogs.com/miracle-luna/p/12049658.html

Java 检查IPv6地址的合法性
https://www.cnblogs.com/miracle-luna/p/12041780.html

Java 实现判断 主机是否能 ping 通
https://www.cnblogs.com/miracle-luna/p/12026797.html

Java 实现 bash命令的更多相关文章

  1. Java 实现 ssh命令 登录主机执行shell命令

    Java 实现 ssh命令 登录主机执行shell命令 1.SSH命令 SSH 为 Secure Shell 的缩写,由 IETF 的网络小组(Network Working Group)所制定:SS ...

  2. Java 实现 telnet命令 验证主机端口的连通性

    Java 实现 telnet命令 验证主机端口的连通性 1.Telnet 命令 Telnet协议是TCP/IP协议族中的一员,是Internet远程登录服务的标准协议和主要方式.它为用户提供了在本地计 ...

  3. java 调用bash shell脚本阻塞的小问题的解决

    java  调用bash shell脚本阻塞的小问题的解决 背景 使用java实现的web端,web端相应用户的界面操作,使用java调用bash实现的shell脚本进行实际的操作,操作完成返回执行结 ...

  4. Linux常用bash命令

    目录 bash命令 基础操作 export | whereis | which | clear 文件操作 ls | touch | cat | more | head | tail | mv | cp ...

  5. Linux Bash命令总结

    Bash命令 一:man命令,是manual 手册的意思,如man ps表示查看ps命令的手册,man man查看man命令的手册:也可以通过man xx查看是否有xx命令. 二:cat命令,用来一次 ...

  6. java运行Linux命令

    <%@ page language="java" import="java.util.*,java.io.*" pageEncoding="UT ...

  7. java 执行shell命令遇到的坑

    正常来说java调用shell命令就是用 String[] cmdAry = new String[]{"/bin/bash","-c",cmd} Runtim ...

  8. java与javac命令的功用

    一.javac用来编译java程序,比如说我写了一个Server.java文件,首先通过命令行进入.java文件所在的路径, 然后通过输入 javac Server.java 命令行来完成编译,编译之 ...

  9. Windows 10预览版14316开启Bash命令支持

    00x0 前言 4月7日凌晨,微软推送了最新的Windows 10一周年更新预览版14316,其中重要的是原生支持Linux Bash命令行支持. 00x1 问题 如何开启Linux Bash命令行? ...

随机推荐

  1. 三星Q470c Logo界面无限掉电重启,变砖后的挽救过程

    背景 三星笔记本的部分型号如:NP530 Q470等 安装win8后再次重装系统(我弄了个Ubuntu18)会导致无法进入BIOS菜单页面的问题.启动显示logo页面后,能够听到明显啪的一声(硬盘掉电 ...

  2. PAT Basic 1074 宇宙无敌加法器 (20 分)

    地球人习惯使用十进制数,并且默认一个数字的每一位都是十进制的.而在 PAT 星人开挂的世界里,每个数字的每一位都是不同进制的,这种神奇的数字称为“PAT数”.每个 PAT 星人都必须熟记各位数字的进制 ...

  3. scrapy爬虫框架配置--settings

    我们可以用一个settings.py做个简单的介绍和解析:例: ----> # -*- coding: utf-8 -*- # Scrapy settings for xigua project ...

  4. java中的io流总结(一)

    知识点:基于抽象基类字节流(InputStream和OutputStream).字符流(Reader和Writer)的特性,处理纯文本文件,优先考虑使用字符流BufferedReader/Buffer ...

  5. linux下18种监测网络带宽方式

    1. nload nload是一个命令行工具,让用户可以分开来监控入站流量和出站流量.它还可以绘制图表以显示入站流量和出站流量,视图比例可以调整.用起来很简单,不支持许多选项. 所以,如果你只需要快速 ...

  6. Lucene简单了解和使用

    一,Lucene简介 1 . Lucene  是什么? Lucene 是一个开放源代码的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎, ...

  7. Nginx中ngx_stream_core_module和ngx_stream_proxy_module

    ngx_stream_core_module模块该模块模拟基于tcp或udp的服务连接的反向代理理,即⼯工作于传输层的调度器器指令:17.1 streamSyntax: stream { ... }D ...

  8. 7月新的开始 - Axure学习01 - 元件库、元件交互样式设置

    解释: Axure 属于原型制作里的霸道总裁 1.原型:原型模拟真实产品的功能与设计.用于在初期阶段测试产品的可行性与效果.来节省开发成本与周期. 2.线框图:在初期实现对产品的了解.实现产品的基本结 ...

  9. Django2.2连接MySQL问题解决

    报错一: django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.13 or newer is required; you have ...

  10. django中权限控制到按钮级别

    权限控制到按钮级别 :          1.思路 :                  由于每个按钮都能认为是一个权限,所以每个按钮都会有一个自己的路径,这些路径都在用户登录时保存在了session ...