有道无术,术尚可求,有术无道,止于术。
本系列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);
执行结果:
 



















