您好,登录后才能下订单哦!
小编给大家分享一下如何通过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-AgainSHell。
Bash是一个命令处理器,通常运行于文本窗口中,并能执行用户直接输入的命令。Bash还能从文件中读取命令,这样的文件称为脚本。和其他Unix shell 一样,它支持文件名替换(通配符匹配)、管道、here文档、命令替换、变量,以及条件判断和循环遍历的结构控制语句。包括关键字、语法在内的基本特性全部是从sh借鉴过来的。其他特性,例如历史命令,是从csh和ksh借鉴而来。总的来说,Bash虽然是一个满足POSIX规范的shell,但有很多扩展。
2、Java实现 BASH命令执行Shell脚本
1)代码实现如下:
import ch.ethz.ssh3.Connection;import ch.ethz.ssh3.Session;import ch.ethz.ssh3.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/miracleluna.txtHello, 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-ssh3</artifactId> <version>262</version> </dependency>
以上是“如何通过Java实现bash命令过程解析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。