百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

如何在Spring Boot中连接SSH请求?

ztj100 2025-02-21 16:25 28 浏览 0 评论

SSH是一种远程的网络通信协议,主要的作用就是通过一种不安全的方式链接到远程的计算机上对远程机器进行操作,这里所谓的不安全是指这种方式很容易就被攻击了,所以一般不建议非安全网络环境来通过SSH进行服务器的连接操作。但是在正常的服务管理的场景中,我们都是通过SSH协议进行连接的,下面我们就来看看如何在Spring Boot中来实现SSH来实现与远程服务的交互。

引入相关依赖

老生常谈,第一步就是在SpringBoot项目中引入SSH链接所需要的连接配置,这里我们使用的是JSch(Java Secure Channel),它是一个轻量级的Java链接库,可以用来执行SSH连接、命令执行、文件上传/下载等操作,当然我们还可以通过其他的方式来进行连接。


    
    
        org.springframework.boot
        spring-boot-starter-web
    

    
    
        com.jcraft
        jsch
        0.1.55
    

创建SSH连接工具类

依赖配置完成之后,为了能够复用链接,我们可以将对SSH的操作封装到一个工具类中,这样我们就可以对相关链接操作进行复用。如下所示,我们创建一个SSHUtils类。

import com.jcraft.jsch.*;

import java.io.InputStream;
import java.util.Properties;

public class SSHUtils {

    private String host;
    private String user;
    private String password;
    private int port = 22;  // 默认SSH端口

    // 构造方法,初始化连接信息
    public SSHUtils(String host, String user, String password) {
        this.host = host;
        this.user = user;
        this.password = password;
    }

    // 创建并返回SSH会话
    private Session getSession() throws JSchException {
        JSch jsch = new JSch();
        Session session = jsch.getSession(user, host, port);
        session.setPassword(password);

        // 设置为不检查主机密钥
        session.setConfig("StrictHostKeyChecking", "no");

        // 建立连接
        session.connect();
        return session;
    }

    // 执行SSH命令
    public String executeCommand(String command) throws JSchException, Exception {
        Session session = getSession();
        Channel channel = session.openChannel("exec");
        ((ChannelExec) channel).setCommand(command);
        channel.setInputStream(null);

        // 获取执行结果
        InputStream in = channel.getInputStream();
        channel.connect();

        StringBuilder output = new StringBuilder();
        byte[] buffer = new byte[1024];
        while (true) {
            while (in.available() > 0) {
                int i = in.read(buffer, 0, 1024);
                if (i < 0) break;
                output.append(new String(buffer, 0, i));
            }
            if (channel.isClosed()) {
                break;
            }
            Thread.sleep(100);
        }
        channel.disconnect();
        session.disconnect();
        return output.toString();
    }

    // 获取SSH会话状态
    public boolean isConnected(Session session) {
        return session.isConnected();
    }
}

使用SSH连接工具

完成之后,可以在服务层中通过SSHUtils类来连接远程服务器并执行相关命令,如下所示,我们可以创建一个服务来调用SSHUtils,通过SSH连接到远程机器执行命令。

import org.springframework.stereotype.Service;

@Service
public class SSHService {

    private final String host = "your-remote-server.com";  // 远程主机
    private final String user = "your-username";            // 用户名
    private final String password = "your-password";        // 密码

    private final SSHUtils sshUtils;

    public SSHService() {
        sshUtils = new SSHUtils(host, user, password);
    }

    public String executeRemoteCommand(String command) {
        try {
            return sshUtils.executeCommand(command);
        } catch (Exception e) {
            e.printStackTrace();
            return "Error executing SSH command: " + e.getMessage();
        }
    }
}

接下来就是在Controller中来调用这个服务来实现远程服务器的连接以及命令的执行操作。

@RestController
public class SSHController {

    @Autowired
    private SSHService sshService;

    @GetMapping("/execute")
    public String executeCommand(@RequestParam String command) {
        return sshService.executeRemoteCommand(command);
    }
}

高级用法:上传和下载文件

当然除了简单的执行命令的操作,我们还可以通过JSch来实现文件的上传下载操作,如下所示。

文件上传

public void uploadFile(String localFile, String remoteFile) throws JSchException, SftpException {
    Session session = getSession();
    Channel channel = session.openChannel("sftp");
    channel.connect();
    ChannelSftp sftpChannel = (ChannelSftp) channel;

    sftpChannel.put(localFile, remoteFile);  // 上传文件
    sftpChannel.exit();
    session.disconnect();
}

文件下载

public void downloadFile(String remoteFile, String localFile) throws JSchException, SftpException {
    Session session = getSession();
    Channel channel = session.openChannel("sftp");
    channel.connect();
    ChannelSftp sftpChannel = (ChannelSftp) channel;

    sftpChannel.get(remoteFile, localFile);  // 下载文件
    sftpChannel.exit();
    session.disconnect();
}

通过这种方式,可以在Spring Boot应用中实现对远程文件的上传和下载操作。

当然在实际使用场景中,我们还需要考虑到远程操作的异常处理,使用SSH连接池等操作来提高程序的健壮性。

总结

本文介绍了如何在Spring Boot应用中通过JSch库连接远程SSH服务器,执行远程命令,以及上传/下载文件。通过封装SSH连接的功能,我们可以很容易的地在Spring Boot应用中集成SSH协议,进行远程管理和自动化操作。而对于实际操作中的一些复杂场景,我们可以更具实际场景的使用来进行优化管理。有兴趣想要深入了解的读者可以在评论区留言我们一起讨论。

相关推荐

30天学会Python编程:16. Python常用标准库使用教程

16.1collections模块16.1.1高级数据结构16.1.2示例...

强烈推荐!Python 这个宝藏库 re 正则匹配

Python的re模块(RegularExpression正则表达式)提供各种正则表达式的匹配操作。...

Python爬虫中正则表达式的用法,只讲如何应用,不讲原理

Python爬虫:正则的用法(非原理)。大家好,这节课给大家讲正则的实际用法,不讲原理,通俗易懂的讲如何用正则抓取内容。·导入re库,这里是需要从html这段字符串中提取出中间的那几个文字。实例一个对...

Python数据分析实战-正则提取文本的URL网址和邮箱(源码和效果)

实现功能:Python数据分析实战-利用正则表达式提取文本中的URL网址和邮箱...

python爬虫教程之爬取当当网 Top 500 本五星好评书籍

我们使用requests和re来写一个爬虫作为一个爱看书的你(说的跟真的似的)怎么能发现好书呢?所以我们爬取当当网的前500本好五星评书籍怎么样?ok接下来就是学习python的正确姿...

深入理解re模块:Python中的正则表达式神器解析

在Python中,"re"是一个强大的模块,用于处理正则表达式(regularexpressions)。正则表达式是一种强大的文本模式匹配工具,用于在字符串中查找、替换或提取特定模式...

如何使用正则表达式和 Python 匹配不以模式开头的字符串

需要在Python中使用正则表达式来匹配不以给定模式开头的字符串吗?如果是这样,你可以使用下面的语法来查找所有的字符串,除了那些不以https开始的字符串。r"^(?!https).*&...

先Mark后用!8分钟读懂 Python 性能优化

从本文总结了Python开发时,遇到的性能优化问题的定位和解决。概述:性能优化的原则——优化需要优化的部分。性能优化的一般步骤:首先,让你的程序跑起来结果一切正常。然后,运行这个结果正常的代码,看看它...

Python“三步”即可爬取,毋庸置疑

声明:本实例仅供学习,切忌遵守robots协议,请不要使用多线程等方式频繁访问网站。#第一步导入模块importreimportrequests#第二步获取你想爬取的网页地址,发送请求,获取网页内...

简单学Python——re库(正则表达式)2(split、findall、和sub)

1、split():分割字符串,返回列表语法:re.split('分隔符','目标字符串')例如:importrere.split(',','...

Lavazza拉瓦萨再度牵手上海大师赛

阅读此文前,麻烦您点击一下“关注”,方便您进行讨论和分享。Lavazza拉瓦萨再度牵手上海大师赛标题:2024上海大师赛:网球与咖啡的浪漫邂逅在2024年的上海劳力士大师赛上,拉瓦萨咖啡再次成为官...

ArkUI-X构建Android平台AAR及使用

本教程主要讲述如何利用ArkUI-XSDK完成AndroidAAR开发,实现基于ArkTS的声明式开发范式在android平台显示。包括:1.跨平台Library工程开发介绍...

Deepseek写歌详细教程(怎样用deepseek写歌功能)

以下为结合DeepSeek及相关工具实现AI写歌的详细教程,涵盖作词、作曲、演唱全流程:一、核心流程三步法1.AI生成歌词-打开DeepSeek(网页/APP/API),使用结构化提示词生成歌词:...

“AI说唱解说影视”走红,“零基础入行”靠谱吗?本报记者实测

“手里翻找冻鱼,精心的布局;老漠却不言语,脸上带笑意……”《狂飙》剧情被写成歌词,再配上“科目三”背景音乐的演唱,这段1分钟30秒的视频受到了无数网友的点赞。最近一段时间随着AI技术的发展,说唱解说影...

AI音乐制作神器揭秘!3款工具让你秒变高手

在音乐创作的领域里,每个人都有一颗想要成为大师的心。但是面对复杂的乐理知识和繁复的制作过程,许多人的热情被一点点消磨。...

取消回复欢迎 发表评论: