- 文档
- 教程
- 后端
【免费下载链接】CodeGuide
:books: 本代码库是作者小傅哥多年从事一线互联网 Java 开发的学习历程技术汇总,旨在为大家提供一个清晰详细的学习教程,侧重点更倾向编写Java核心内容。如果本仓库能为您提供帮助,请给予支持(关注、点赞、分享)!
本篇是《WaLiSSH - AI Shell 智能终端》项目的第 1-3 节内容梳理。文章围绕"如何在 Spring Boot 工程中完成 SSH 连接能力对接"这一核心目标展开,介绍 JSch 技术选型、SSH 协议与认证机制,以及 DDD 架构下 Domain 层 Port 接口与 Infrastructure 层实现分离的设计思想。读完本文,你将理解 AI Shell 运行时智能体与底层 Shell 能力的关系,掌握 SSH 会话建立、远程命令执行、SFTP 文件传输这三类能力的适用范围,并看清 WaLiSSH 后续章节(库表设计、领域设计、接口对接、终端命令处理)如何在这块地基上逐层构建。
一、本章诉求:先搭起 AI Shell 的 Shell 能力
WaLiSSH 的目标是构建一个AI Shell 运行时智能体。可以简单地把运行时智能体理解为:对用户的请求进行意图识别(LLM + Prompt + 上下文),再根据具体场景诉求,与相关的mcp、skills、tool、cli进行交互操作,直至完成用户请求。
要做 AI Shell,第一步就是先把与服务器的Shell 能力建立起来——也就是本节的核心内容:在 Spring Boot 工程中对接 SSH。之后再把 Shell 能力包装为工具(Tool)和相应的提示词(Prompt),让 LLM 大模型可以识别到,这样就完成了最简单的 AI Shell 能力闭环。
需要特别强调的是,这套流程是通用的:当你完整学完 WaLiSSH 中"SSH 能力 → 工具化 → 提示词 → LLM 意图识别"这一套流程后,就可以横向复用到 AI MySQL、AI Redis、AI Coding,甚至互联网公司里最常见的 AI 智能客服等场景。SSH 连接只是第一个载体,方法论的收益远超这一个功能点。
敲黑板:这一节的代码量不大,核心也不只是"写出代码",更重要的是理解 DDD 架构下Domain 层 Port 接口与 Infrastructure 层实现的分离。掌握了这个设计思想,以后无论底层换成什么 SSH 库,Domain 层的代码一行都不用改。
二、技术选型:为什么使用 JSch
SSH 对接选用JSch——纯 Java 实现的 SSH2 协议库,成熟稳定,后续还会基于它实现命令执行和 SFTP 文件传输(这一选型并不局限,你也可以检索其他 SSH 协议库多方面对比)。在项目整体技术栈中,JSch 与 Spring Boot、Google ADK 等一起构成了 WaLiSSH 服务端(walissh-server)的核心依赖,正如第1-1节:初始化工程搭建中所列:后端采用 DDD 领域驱动设计 + Spring Boot + Google ADK(Agent Development Kit)+ JSch,其中 JSch 负责 SSH 连接、远程命令执行、文件传输,是实现 SSH 终端功能的核心依赖。
2.1 SSH 协议基础
SSH(Secure Shell)是一种加密的网络传输协议,用于在不安全的网络中安全地远程登录和执行命令。可以把 SSH 理解为一条加密的"隧道",客户端与服务器之间的所有数据都在隧道内安全传输,外人无法窃听或篡改。
SSH 连接支持两种认证方式,两者各有适用场景:
| 认证方式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 密码认证 | 简单直观,无需额外配置 | 安全性相对较低,需要每次输入密码 | 快速测试、临时连接 |
| 密钥认证 | 安全性高,支持免密登录 | 需要生成和管理密钥对 | 生产环境、自动化运维 |
在 WaLiSSH 的实现中,两种认证方式都支持,且互斥使用——优先使用密钥,没有密钥则走密码。这一认证策略决定了后续连接配置的数据结构:一条 SSH 连接需要同时承载"认证方式"与"认证凭证"两类信息,这与第1-4节:ssh连接配置库表设计中"认证方式(密码 or 私钥)、认证凭证(密码 or 私钥内容)"字段的设计完全对应。
2.2 JSch 库的三个核心能力
JSch 是 Java Secure Channel 的缩写,提供了完整的 SSH2 客户端功能,包括:
- 端口转发(本地 / 远程 / 动态)
- 文件传输(SFTP)
- 执行远程命令
- X11 转发
在 WaLiSSH 项目中,主要使用它的三个能力,并且三者分别在项目的不同阶段落地:
| 能力 | 对应通道 | 落地阶段 |
|---|---|---|
| 建立 SSH 会话 | Session | 本节实现 |
| 执行远程命令 | ChannelExec | 本节测试时验证,使用 IntelliJ IDEA |
| 创建 SFTP 通道 | ChannelSftp | 后续章节使用(文件上传 / 下载) |
在 Spring Boot 工程中引入 JSch 依赖(对应文档给出的 mwiede 维护分支的坐标形式)后,就可以围绕Session建立加密会话、通过ChannelExec执行远程命令、通过ChannelSftp传输文件,这三条通道共同构成了 WaLiSSH 面向云服务器的基础操作面。
三、DDD 架构下的对接设计:Port 接口与 Infrastructure 实现分离
本节在工程落地上最值得学习的设计点,是 DDD 分层带来的"依赖倒置":
- Domain 层只定义 Port 接口:领域层不关心 SSH 具体怎么连、用什么库连,只声明业务需要的连接、执行、断开等能力契约;
- Infrastructure 层提供实现:JSch 相关的会话建立、参数装配、连接建立等细节全部沉淀在基础设施层,由 Port 接口的实现类承载。
这样做的好处非常直接:未来无论底层从 JSch 换成其他 SSH 库(比如 Apache MINA SSHD),Domain 层的业务代码一行都不用改,只替换 Infrastructure 层的实现即可。这也是后续章节反复强化的 DDD 设计主线——第1-5节:连接SSH简单领域设计正是在此基础上,把 SSH 连接的增删改查与建立/断开操作封装进领域服务,并强调"领域层关注业务规则设计,而不是调数据库"。
同时要注意,SSH 连接参数不只是"主机 + 用户名 + 密码"这么简单。结合第1-4节:ssh连接配置库表设计的需求分析,一条连接配置至少包含以下三类信息,它们最终都会在 Infrastructure 层装配到 JSch 的Session上:
基础连接信息:
- 连接名称(如"腾讯云服务器")
- 主机地址(如
140.143.183.225) - 端口号(默认
22) - 用户名(如
root、ubuntu) - 认证方式(密码 or 私钥)
- 认证凭证(密码 or 私钥内容)
高级配置信息:
- 连接超时时间(默认 10 秒)
- 保活间隔(默认 60 秒)
- 是否启用压缩
- 是否严格检查主机密钥
- 已知主机密钥列表
- 连接后执行的启动命令
系统管理信息:
- 用户ID(区分不同用户的连接配置)
- 连接状态(未连接、已连接、连接中、连接失败)
- 加密标志(标识凭证是否加密)
- 创建时间、更新时间
- 逻辑删除标志
其中"连接超时时间""保活间隔""是否严格检查主机密钥"等高级配置,在 JSch 中都有对应的会话参数设置项,Infrastructure 层实现时把这些配置逐项映射到Session的配置接口上即可;"加密标志"则对应凭证(密码/私钥)在数据库中的加密存储方案。
四、从 Session 到终端:本节之后的完整落地链路
本节建立的 SSH 连接能力不是终点,而是 WaLiSSH 系列课程的起点。从第1-3节:ssh连接云服务器往后,这条能力链路的走向非常清晰:
- 持久化连接配置(第 1-4 节):把上文提到的连接信息拆分为
ssh_connection与ssh_connection_config两张表存储,涉及表拆分设计、字段类型选择(varchar、tinyint、longtext)、索引设计(主键、唯一索引、普通索引)以及密码/私钥的加密存储方案; - 封装领域服务(第 1-5 节):把 PO、DAO、Mapper 向上封装到 Domain 层,形成 SSH 连接管理领域服务,完成创建、查询、更新、删除连接配置以及建立/断开连接等能力,并配套单测验证;
- 暴露 HTTP 接口(第 1-6 节):服务端提供
SshConnectionController,封装领域服务,把操作 SSH 服务器的能力通过创建连接、更新连接、删除连接、获取连接、连接列表等接口对外暴露,前端通过api/request.ts与接口对接; - 实现终端命令交互(第 1-7 节):JSch 的
Session与ChannelExec在这里被真正盘活。前端 xterm.js 的输入路径为:用户在终端敲键盘 →onData事件拿到输入字符 → 写入缓冲(10ms 批量合并)→ 调用POST /terminal/write发到后端 → 写入 JSch Shell 的OutputStream→ 远程 Shell 收到字符并执行;输出路径为:远程 Shell 产生输出 → 后台读取线程持续从 JSchInputStream读取 → 写入StringBuilder缓冲区 → 前端每 50ms 调用GET /terminal/read轮询 → 拿到输出后terminal.write()渲染到 xterm.js。这里没有用 WebSocket 而是采用 HTTP 轮询,是因为 WaLiSSH 是 Tauri 桌面应用,前后端都在本地,网络延迟极低,50ms 轮询对终端操作完全够用,且实现更简单。
而ChannelSftp通道则在后续文件能力中承担上传/下载职责,对应 WaLiSSH 产品中"打开本地多个文件夹、切换选择、上传文件"的 SFTP 增强体验(详见项目总览文档)。
五、小结
本节完成了 WaLiSSH 从"空工程"到"具备服务器连接能力"的关键一步:
- 能力定位:SSH 连接是 AI Shell 运行时智能体的"手脚",意图识别与工具编排是"大脑",先有手脚才能谈智能;
- 技术底座:JSch 以
Session/ChannelExec/ChannelSftp三个通道覆盖会话建立、命令执行、文件传输,配以"优先密钥、兜底密码"的互斥认证策略; - 架构纪律:Domain 层 Port 接口与 Infrastructure 层实现分离,让 SSH 库的更换不影响业务代码,这是整条 DDD 学习主线的起点,也是后续库表设计、领域服务、HTTP 接口、终端命令处理逐层构建的根基。
掌握本节之后,你已经拥有了把任意一台云服务器"接入"WaLiSSH 的能力;接下来的章节,将在这条加密隧道之上,逐步装配智能体的意图识别与工具调用,让 AI 替你执行运维命令。
- 文档
- 教程
- 后端
【免费下载链接】CodeGuide
:books: 本代码库是作者小傅哥多年从事一线互联网 Java 开发的学习历程技术汇总,旨在为大家提供一个清晰详细的学习教程,侧重点更倾向编写Java核心内容。如果本仓库能为您提供帮助,请给予支持(关注、点赞、分享)!
相关推荐
WaLiSSH:基于 Spring AI + Google ADK + Tauri 的 AI Shell 智能运维终端实战
WaLiSSH:基于 Spring AI + Google ADK + Tauri 的 AI Shell 智能运维终端实战 WaLiSSH(AI Shell 智
文档教程后端LunaTranslator 语音指定与语音修正:按人物角色自动切换 TTS 声音的完整指南
LunaTranslator 语音指定与语音修正:按人物角色自动切换 TTS 声音的完整指南 导读 :在视觉小说等文本型游戏中,不同角色通常需要不同的语音才能还
文档教程后端WaLiSSH 智能体实战:引入 FunctionTool 构建最小 MVP 版本 AI Shell Agent
WaLiSSH 智能体实战:引入 FunctionTool 构建最小 MVP 版本 AI Shell Agent WaLiSSH 是一款基于 Spring AI
文档教程后端
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考