平时开发里,遇到服务器出点小问题,还得打开终端、输密码、连上去,一顿敲命令才能搞定。如果这个过程能直接在浏览器完成,不用装额外的工具,是不是舒服很多?今天就聊一个挺实用的小方案:用 SpringBoot 做个 SSH 客户端,在网页里直接远程执行命令。

核心思路

原理很简单,就是后端用 Java SSH 库连接远程服务器,执行命令,返回执行结果;前端通过接口把命令发过去,然后展示返回的内容。

Java 里用得多的 SSH 库有两个:

  • JSch:老牌库,轻量级,功能够用。

  • Apache Mina SSHD:功能更全一些,但配置稍多。

这里用 JSch 举例,因为它足够简单,依赖也少。

准备工作

先在 SpringBoot 项目里加依赖(Maven):

<dependency>
    <groupId>com.jcraft</groupId>
    <artifactId>jsch</artifactId>
    <version>0.1.55</version>
</dependency>

然后写一个工具类,用来连接 SSH 并执行命令:

import com.jcraft.jsch.*;

publicclass SshClient {

    public static String execCommand(String host, int port, String user, String password, String command) {
        StringBuilder result = new StringBuilder();
        Session session = null;
        ChannelExec channel = null;

        try {
            JSch jsch = new JSch();
            session = jsch.getSession(user, host, port);
            session.setPassword(password);
            session.setConfig("StrictHostKeyChecking", "no");
            session.connect(5000);

            channel = (ChannelExec) session.openChannel("exec");
            channel.setCommand(command);
            channel.setErrStream(System.err);
            channel.connect();

            try (var input = channel.getInputStream()) {
                byte[] buffer = newbyte[1024];
                int len;
                while ((len = input.read(buffer)) != -1) {
                    result.append(new String(buffer, 0, len));
                }
            }

        } catch (Exception e) {
            e.printStackTrace();
            result.append("Error: ").append(e.getMessage());
        } finally {
            if (channel != null) channel.disconnect();
            if (session != null) session.disconnect();
        }
        return result.toString();
    }
}

这个方法传入服务器信息和命令,返回执行结果。 配置了 StrictHostKeyChecking=no,是为了避免第一次连接时卡在 host key 确认上。

写个 SpringBoot Controller

接下来,写个简单的接口,把命令执行的结果返回给前端。

import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/ssh")
publicclass SshController {

    @PostMapping("/exec")
    public String exec(@RequestParam String command) {
        // 这里写死服务器信息,实际可以做成配置文件读取
        String host = "192.168.1.100";
        int port = 22;
        String user = "root";
        String password = "123456";
        return SshClient.execCommand(host, port, user, password, command);
    }
}

这样,前端只要发个 POST 请求到 /ssh/exec,带上 command 参数,就能在浏览器执行远程命令并拿到结果。

安全问题要注意

直接在浏览器执行服务器命令,安全性肯定是第一位的。几个建议:

  1. 限制可执行命令:不要让用户随便输,可以做个白名单。

  2. 账号权限最小化:最好用非 root 用户执行命令。

  3. 加鉴权:接口加上登录或 Token 校验。

  4. 日志记录:保存所有执行过的命令和结果,方便排查。

用前端做个简单页面

如果用 Vue / React,随便写个输入框和按钮,调用这个接口就行。比如 Vue 里这样写:

axios.post('/ssh/exec', { command: this.inputCommand })
     .then(res => { this.output = res.data; });

配合个 textarea 输出结果,基本就能替代你临时登录服务器执行命令的需求了。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐