有道无术,术尚可求,有术无道,止于术。
本系列Spring Boot版本2.7.0
文章目录
- 前言
- 本地服务器
- 远程服务器
前言
在某些实际开发场景中,我们需要调用JAVA程序去执行一些服务器操作命令,比如:
- 获取服务器的CPU、网卡、内存、硬盘状态。
- 执行服务器上某个脚本
本地服务器
可以使用JDK
自带的功能在当前应用程序运行的服务器上进行操作。
Runtime
类封装了运行时环境,可以调用Runtime
对象的方法去执行服务器操作命令。
Runtime.exec
方法创建一个本地进程,并返回一个Process
子类的实例,该子类可用于控制进程并获取有关它的信息。Process
类提供了从进程执行输入、向进程执行输出、等待进程完成、检查进程的退出状态、破坏(杀死)过程等功能。
示例代码如下:
// 获取当前应用程序的运行环境对象
Runtime runtime = Runtime.getRuntime();
// 1. 演示:执行ipconfig命令,获取IP信息
// 执行对应的可执行文件或命令
Process process = runtime.exec("ipconfig"); // Windows 命令
// 获取返回结果
InputStream inputStream = process.getInputStream();
String ipInfo = IoUtil.read(inputStream, CharsetUtil.systemCharset());
System.out.println(ipInfo);
// 获取内存情况
long totalMemory = runtime.totalMemory();
long freeMemory = runtime.freeMemory();
System.out.println("totalMemory:" + totalMemory);
System.out.println("freeMemory:" + freeMemory);
执行结果:
也可以使用Hutool
工具类库提供的工具类简化操作。
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.12</version>
</dependency>
示例代码如下:
/**
* exec 执行命令行命令,返回Process对象,Process可以读取执行命令后的返回内容的流
* 快捷方法
* execForStr 执行系统命令,返回字符串
* execForLines 执行系统命令,返回行列表
*/
String result = RuntimeUtil.execForStr("ipconfig");
远程服务器
当应用程序想通过JAVA
在远程服务器上执行命令,就必须连接到远程。
比如Linux
服务器时,需要使用SSH
协议进行连接。有很多开源的框架已经实现,比如下面这三个:
<dependency>
<groupId>com.hierynomus</groupId>
<artifactId>sshj</artifactId>
<version>0.32.0</version>
</dependency>
<dependency>
<groupId>ch.ethz.ganymed</groupId>
<artifactId>ganymed-ssh2</artifactId>
<version>262</version>
</dependency>
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.54</version>
</dependency>
在Hutool
也提供了这种功能实现,官方文档。
// 新建会话,此会话用于ssh连接到跳板机(堡垒机)
Session session = JschUtil.getSession("192.168.6.25", 22, "root", "2123!@#");
String exec = JschUtil.exec(session, "df -h", CharsetUtil.systemCharset());
System.out.println(exec);
JschUtil.close(session);
执行结果: