SpringBoot + SSH 客户端:在浏览器中执行远程命令
·
平时开发里,遇到服务器出点小问题,还得打开终端、输密码、连上去,一顿敲命令才能搞定。如果这个过程能直接在浏览器完成,不用装额外的工具,是不是舒服很多?今天就聊一个挺实用的小方案:用 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 参数,就能在浏览器执行远程命令并拿到结果。
安全问题要注意
直接在浏览器执行服务器命令,安全性肯定是第一位的。几个建议:
-
限制可执行命令:不要让用户随便输,可以做个白名单。
-
账号权限最小化:最好用非 root 用户执行命令。
-
加鉴权:接口加上登录或 Token 校验。
-
日志记录:保存所有执行过的命令和结果,方便排查。
用前端做个简单页面
如果用 Vue / React,随便写个输入框和按钮,调用这个接口就行。比如 Vue 里这样写:
axios.post('/ssh/exec', { command: this.inputCommand })
.then(res => { this.output = res.data; });
配合个 textarea 输出结果,基本就能替代你临时登录服务器执行命令的需求了。
更多推荐
所有评论(0)