通过Java实现bash命令过程解析
作者:龙凌云端 发布时间:2023-01-07 17:38:25
标签:Java,实现,bash,命令
这篇文章主要介绍了通过Java实现bash命令过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
1、BASH 命令简介
Bash,Unix shell的一种,在1987年由布莱恩·福克斯为了GNU计划而编写。 * 发布第一个正式版本,原先是计划用在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借鉴过来的。其他特性,例如历史命令,是从csh和ksh借鉴而来。总的来说,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>
来源:https://www.cnblogs.com/miracle-luna/p/12050728.html


猜你喜欢
- 今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都是可以提取出来的,就自己把那些公共部分提出出来,以后如果要获取某部分的硬件信息就
- 波浪球的效果一直都是想模仿的对象,在最近一段时间里模仿了这一界面,其实所用知识并不多。1)、波浪的效果是利用三角函数来实现的,在自定义vie
- BeanUtils.copyProperties无法封装使用BeanUtils.copyProperties(user, memeber);
- 简介TreeMap使用红黑树存储元素,可以保证元素按key值的大小进行遍历。继承体系TreeMap实现了Map、SortedMap、Navi
- 前言最近在给熔断器组件增加一个降级策略(Hystrix好像没有这个配置),我们提供了如下几种策略:1、默认策略2、返回常量值3、抛出指定异常
- 使用环境项目环境:Idea 2020.2.3、 Maven 3.6.3 、springboot 2.1.4本人在创建springboot项目
- 什么是粘包/拆包 一般所谓的TCP粘包是在一次接收数据不能完全地体现
- 开始研究android开发,搭建开发环境的时候就出了问题……果然是好事多磨~ 安装了jdk,配置环境变量,安装了完整版的adt、创建了hel
- 本文实例讲述了java识别一篇文章中某单词出现个数的方法。分享给大家供大家参考。具体如下:1. java代码:import java.io.
- 当CLR未能分配所需的足够内存时,将发生System.OutOfMemoryException。System.OutOfMemoryExce
- 飞行棋游戏大家应该都玩过吧,如何使用C#语言进行编写,本文实例就为大家分享了飞行棋C#实现代码,供大家参考,具体内容如下using Syst
- 本文实例为大家分享了java实现员工工资管理系统的具体代码,供大家参考,具体内容如下一、题目要求设计员工工资管理系统,实现以下功能:(1)输
- 一、前言无论承接什么样的需求,是不是身边总有那么几个人代码写的烂,但是却时常有测试小姐姐过来聊天(求改bug)、有产品小伙伴送吃的(求写需求
- 场景yitter-idgenerator 是基于雪花算法进行改造的分布式ID自增算法,集成时需要为每个服务设置唯一的机器号,才能保证生成的I
- 本文实例为大家分享了Spring Boot图片上传的具体代码,供大家参考,具体内容如下package com.clou.inteface.d
- 本文实例讲述了Android编程之OpenGL绘图技巧。分享给大家供大家参考,具体如下:很久不用OpenGL ES绘图,怕自己忘记了,于是重
- 一、项目简述功能: 系统分为三个角色。最高权限管理员,学生,教师,包括 学生管理,教师管理,课程管理,选课,退课,成绩查 询。,教学课程,查
- java 根据经纬度获取地址实现代码实现代码:public class GetLocation { public
- 本文实例实现了C#一键换IP、重置DNS、网关及掩码的功能,具体实现的功能为在程序界面窗口中设置ip地址和子网掩码,设置网关地址,设置DNS
- 一,栈1,概念在我们软件应用 ,栈这种后进先出数据结构的应用是非常普遍的。比如你用浏 览器上网时不管什么浏览器都有 个"后退&qu