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

网友投稿 305 2022-12-16


通过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借鉴过来的。其他特性,例如历史命令,是从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 command(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.gehttp://tStdout());

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 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

HeaUtCuzfllo, I'm SshUtil.

Nice to meet you.^_^

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

org.slf4j

slf4j-api

1.7.21

ch.ethz.ganymed

ganymed-ssh2

262


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java判断主机是否能ping通代码实例
下一篇:Spring实战之方法级别缓存用法示例
相关文章

 发表评论

暂时没有评论,来抢沙发吧~