springboot 远程调用shell脚本,环境为windows

简介: 本文是博主学习SpringBoot的记录,希望对大家有所帮助。

由于需要调用shell脚本实现一些自动化控制操作,特记录一下实现代码。
主要使用到Ganymed SSH-2 for Java包,是java实现SSH-2协议的一个包,利用它在Java程序中连接SSH服务器。
包地址:点我下载
maven仓库地址:点我打开

pom.xml配置

......
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!-- SSH-2协议的包 -->
        <dependency>
            <groupId>ch.ethz.ganymed</groupId>
            <artifactId>ganymed-ssh2</artifactId>
            <version>262</version>
        </dependency>
    </dependencies>
......

yml配置文件

ssh1:
  host: 192.168.227.3
  port: 22
  user: root
  password: 123
 
ssh2:
  host: 192.168.227.4
  port: 22
  user: root
  password: 123

实体类

package com.bq8023.task.domain;

import lombok.Data;

import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;

/**
 * @Author bq8023
 * @Date 21/5/9 19:36
 * @Version 1.0
 */
@Data
public class SSHEntity {
    /**
     * 编码
     */
    private Charset charset = StandardCharsets.UTF_8;
    /**
     * 主机(IP)
     */
    private String host;
    /**
     * 连接端口
     */
    private int port;
    /**
     * 账号
     */
    private String user;
    /**
     * 密码
     */
    private String password;

}

配置服务器SSH

package com.bq8023.task.conf;

import com.bq8023.task.domain.SSHEntity;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * 配置各服务器ssh连接信息
 *
 * @Author bq8023
 * @Date 21/5/9 20:44
 * @Version 1.0
 */

@Configuration
public class SSHConfig {

    @Bean(name = "ssh1")
    @ConfigurationProperties(prefix = "ssh1")
    public SSHEntity sshEntity3() {
        return new SSHEntity();
    }

    @Bean(name = "ssh2")
    @ConfigurationProperties(prefix = "ssh2")
    public SSHEntity sshEntity4() {
        return new SSHEntity();
    }

}

可以在此处配置多台服务器

具体业务

package com.bq8023.task.service;

import com.bq8023.task.domain.SSHEntity;
import org.springframework.stereotype.Service;

import java.io.IOException;

/**
 * @Author bq8023
 * @Date 21/5/9 19:56
 * @Version 1.0
 */
@Service
public interface SSHService {
    /**
     * 连接服务器并 执行shell脚本
     *
     * @param sshEntity ssh连接信息
     * @param shell     shell语句
     * @return shell执行结果
     * @throws IOException 读写异常
     */
    StringBuilder exec(SSHEntity sshEntity, String shell) throws IOException;
}
package com.bq8023.task.service.serviceImpl;

import com.bq8023.task.domain.SSHEntity;
import com.bq8023.task.service.SSHService;

import java.io.IOException;
import java.io.InputStream;

import ch.ethz.ssh2.Connection;
import ch.ethz.ssh2.Session;
import org.springframework.stereotype.Service;

/**
 * @Author bq8023
 * @Date 21/5/9 19:57
 * @Version 1.0
 */
@Service
public class SSHServiceImpl implements SSHService {
    private Connection connect;

    /**
     * 连接服务器并 执行shell脚本
     *
     * @param sshEntity ssh连接信息
     * @param shell     shell语句
     * @return shell执行结果
     * @throws IOException 读写异常
     */
    @Override
    public StringBuilder exec(SSHEntity sshEntity, String shell) throws IOException {
        InputStream inputStream = null;
        StringBuilder result = new StringBuilder();
        try {
            // 认证登录信息
            if (this.login(sshEntity)) {
                // 登陆成功则打开一个会话
                Session session = connect.openSession();
                session.execCommand(shell);
                inputStream = session.getStdout();
                result = this.processStdout(inputStream);
                connect.close();
            }
        } finally {
            if (null != inputStream) {
                inputStream.close();
            }
        }
        return result;
    }

    private boolean login(SSHEntity sshEntity) {
        connect = new Connection(sshEntity.getHost(), sshEntity.getPort());
        try {
            connect.connect();
            return connect.authenticateWithPassword(sshEntity.getUser(), sshEntity.getPassword());
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }
    }

    private StringBuilder processStdout(InputStream in) {
        byte[] buf = new byte[1024];
        StringBuilder builder = new StringBuilder();
        try {
            int length;
            while ((length = in.read(buf)) != -1) {
                builder.append(new String(buf, 0, length));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return builder;
    }
}

测试

package com.bq8023.task;

import com.bq8023.task.domain.SSHEntity;
import com.bq8023.task.service.SSHService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.context.SpringBootTest;

import javax.annotation.Resource;
import java.io.IOException;

@SpringBootTest
class JdtaskApplicationTests {

    @Qualifier("SSHServiceImpl")
    @Autowired
    private SSHService sshService;

    @Resource(name = "ssh1")
    private SSHEntity sshEntity;

    @Test
    void contextLoads() throws IOException {
        StringBuilder stringBuilder = sshService.exec(sshEntity, "pwd");
        System.out.println(stringBuilder);
    }
}

结果输出
在这里插入图片描述

目录
相关文章
|
3月前
|
前端开发 JavaScript Java
【实操】SpringBoot监听Iphone15邮件提醒,Selenium+Python自动化抢购脚本
本文介绍了一个结合SpringBoot和Python的实用功能,旨在监控iPhone 15的库存状态并通过邮件提醒用户。系统采用SpringBoot监听苹果官网API,解析JSON数据判断是否有货,并展示最近的库存记录。此外,还能自动触发Selenium+Python脚本实现自动化购买。文中详细介绍了技术栈、接口分析、邮件配置及自动化脚本的设置方法。该项目不仅适用于熟悉后端开发的人员,也适合回顾Layui和Jquery等前端技术。
52 0
【实操】SpringBoot监听Iphone15邮件提醒,Selenium+Python自动化抢购脚本
|
23天前
|
Oracle 关系型数据库 MySQL
Mysql(1)—简介及Windows环境下载安装
MySQL 是一个流行的关系型数据库管理系统(RDBMS),基于 SQL 进行操作。它由瑞典 MySQL AB 公司开发,后被 Sun Microsystems 收购,现为 Oracle 产品。MySQL 是最广泛使用的开源数据库之一,适用于 Web 应用程序、数据仓库和企业应用。
47 2
|
24天前
|
应用服务中间件 Shell PHP
windows系统配置nginx环境运行pbootcms访问首页直接404的问题
windows系统配置nginx环境运行pbootcms访问首页直接404的问题
|
13天前
|
监控 关系型数据库 MySQL
PowerShell 脚本编写 :自动化Windows 开发工作流程
PowerShell 脚本编写 :自动化Windows 开发工作流程
17 0
|
2月前
|
Python Windows
python之windows脚本启动bat
python之windows脚本启动bat
|
2月前
|
SQL JavaScript 数据库
sqlite在Windows环境下安装、使用、node.js连接
sqlite在Windows环境下安装、使用、node.js连接
|
27天前
|
Windows
Windows系统环境编写DOS批处理文件
Windows系统环境编写DOS批处理文件
28 0
|
3月前
|
Java 应用服务中间件 Windows
【App Service for Windows】为 App Service 配置自定义 Tomcat 环境
【App Service for Windows】为 App Service 配置自定义 Tomcat 环境
|
3月前
|
安全 Shell Windows
记windows自定义bat脚本自启动
【8月更文挑战第27天】在Windows系统中,可让自定义bat脚本自启动的方法有两种:一是利用“启动”文件夹,通过创建bat脚本的快捷方式并将其放置于该文件夹;二是使用任务计划程序,创建一个启动时触发的任务来运行bat脚本。需确保脚本正确安全,避免对系统产生不良影响。
|
3月前
|
Windows
Windows 10找不到恢复环境
Windows 10找不到恢复环境
22 0