README.zh-Hans.md

June 6, 2026 · View on GitHub

OxideTerm

⚡ OxideTerm

面向远程服务器的 AI-native 工作区。
通过 SSH 连接你的服务器,然后在一个本地优先应用里使用终端、文件、端口、传输、轻量编辑和 OxideSens AI。
原生 Tauri 应用 · 纯 Rust SSH · BYOK OxideSens AI · 核心 SSH 工作流无需账号
零 Electron。零 OpenSSL。零遥测。零订阅。BYOK 优先。纯 Rust SSH。

版本 平台 许可证 Rust Tauri 总下载量

下载最新版 下载最新Beta版

🌐 oxideterm.app — Documentation & website

English | 简体中文 | 繁體中文 | 日本語 | 한국어 | Français | Deutsch | Español | Italiano | Português | Tiếng Việt

OxideTerm AI opening a terminal demo

观看 OxideSens 按照用户请求,在 OxideTerm 中打开一个终端。


你可以做什么

  • 并排管理 SSH 终端、SFTP、端口转发、终端内传输和本地 Shell
  • 通过宽限期重连,在网络抖动后继续工作
  • 让 OxideSens AI通过你自己的 AI 提供商检查实时会话,并执行已批准的工作区操作

为什么选择 OxideTerm?

如果你在意...OxideTerm 提供...
一个远程节点,多种工具终端、SFTP、端口转发、trzsz、轻量 IDE、监控和 OxideSens AI都挂在同一个 SSH 工作区上
本地优先 SSH 工作流SSH、SFTP、端口转发、本地 Shell 和配置管理都无需注册;云同步通过官方插件按需启用
BYOK OxideSens AI,而不是平台点数OxideSens 使用你自己的 OpenAI/Ollama/DeepSeek/OpenAI-compatible 端点,支持 MCP、RAG 和已批准的工作区操作
重连稳定性宽限期会先探测旧连接 30 秒再替换它,短暂网络中断时 vim/htop/yazi 仍有机会存活
纯 Rust 原生应用Tauri 2.0 原生应用,russh 0.59 基于 ring 编译,无 Electron,无 OpenSSL/libssh2 依赖
凭证安全密码和 API 密钥保存在 OS 密钥链中,已保存连接的元数据在本地密封存储,.oxide 文件使用 ChaCha20-Poly1305 + Argon2id 加密

它是什么 / 不是什么

OxideTerm 专注于面向远程服务器的本地优先 AI 工作区。它面向希望终端、文件、端口、传输、轻量编辑和 BYOK OxideSens AI围绕自己的机器与远程节点展开的用户。

它不是托管云端 Agent 平台,也不是只追求终端渲染跑分的项目。产品方向更窄:让远程工作像一个本地工作区,同时不要求 OxideTerm 账号。


截图

SSH 终端 + OxideSens AI

带 OxideSens AI 的 SSH 终端
SFTP 文件管理器

SFTP 双窗格文件管理器与传输队列
内置 IDE(CodeMirror 6)

基于 CodeMirror 6 编辑器的内置 IDE 模式
智能端口转发

带自动检测的智能端口转发

下载

GitHub Releases 下载最新版本。


功能概览

分类功能
终端本地 PTY(zsh/bash/fish/pwsh/WSL2)、SSH 远程、本地串口终端、分屏窗格、广播输入、会话录制/回放(asciicast v2)、WebGL 渲染、30+ 主题 + 自定义编辑器、命令面板(⌘K)、禅模式、trzsz 带内文件传输
SSH 与认证连接池与多路复用、ProxyJump(无限跳数)拓扑图、宽限期自动重连、Agent 转发。认证方式:密码、SSH 密钥(RSA/Ed25519/ECDSA)、SSH Agent、证书、keyboard-interactive 2FA、Known Hosts TOFU
SFTP双窗格浏览器、拖放操作、智能预览(图片/视频/音频/代码/PDF/十六进制/字体)、带进度和预计到达时间的传输队列、书签、压缩包解压
IDE 模式CodeMirror 6 支持 30+ 语言、文件树 + Git 状态、多标签页、冲突解决、集成终端。可选 Linux 远程 Agent,其他架构需自行编译并上传
端口转发本地(-L)、远程(-R)、动态 SOCKS5(-D)、无锁消息传递 I/O、重连自动恢复、终止报告、空闲超时
AI(OxideSens)面向目标的助手:理解已保存连接、实时 SSH 会话、终端缓冲区、SFTP 路径、设置和知识库条目;可诊断远程输出、执行已批准命令、检查文件并解释故障,无需 OxideTerm 账号
插件运行时 ESM 加载、18 个 API 命名空间、24 个 UI Kit 组件、冻结 API + Proxy ACL、熔断器、错误时自动禁用
CLIoxt 伴侣工具:JSON-RPC 2.0 基于 Unix Socket / Named Pipe、status/health/list/forward/config/connect/focus/attach/SFTP/import/AI、人类可读 + JSON 输出
安全.oxide 加密导出(ChaCha20-Poly1305 + Argon2id 256 MB)、本地配置静态加密、OS 密钥链、Touch ID(macOS)、便携式加密密钥库、主机密钥 TOFU、zeroize 内存清除
国际化11 种语言:EN、简体中文、繁體中文、日本語、한국어、FR、DE、ES、IT、PT-BR、VI

技术内幕

OxideTerm 的产品表面保持本地优先,但内部面向重度 SSH 工作流构建。完整实现细节保留在下面,方便需要工程细节的读者展开查看。

架构、SSH 内部、重连、AI、转发、插件与更多细节

架构——双平面通信

OxideTerm 将终端数据与控制命令分离为两个独立平面:

┌─────────────────────────────────────┐
│        Frontend (React 19)          │
│  xterm.js 6 (WebGL) + 19 stores     │
└──────────┬──────────────┬───────────┘
           │ Tauri IPC    │ WebSocket (binary)
           │ (JSON)       │ per-session port
┌──────────▼──────────────▼───────────┐
│         Backend (Rust)              │
│  NodeRouter → SshConnectionRegistry │
│  Wire Protocol v1                   │
│  [Type:1][Length:4][Payload:n]      │
└─────────────────────────────────────┘
  • 数据平面(WebSocket):每个 SSH 会话获得独立的 WebSocket 端口。终端字节以带有 Type-Length-Payload 头的二进制帧传输——无 JSON 序列化、无 Base64 编码,热路径零开销。
  • 控制平面(Tauri IPC):连接管理、SFTP 操作、转发、配置——结构化 JSON,但不在关键路径上。
  • Node 优先寻址:前端从不直接触及 sessionIdconnectionId。一切通过 nodeId 寻址,由 NodeRouter 在服务端原子解析。SSH 重连会更换底层 connectionId——但 SFTP、IDE 和转发完全不受影响。

🔩 纯 Rust SSH — russh 0.59

整个 SSH 协议栈使用 russh 0.59,基于 ring 加密后端编译:

  • 零 C/OpenSSL 依赖——完整的加密栈由 Rust 实现,告别"哪个 OpenSSL 版本?"的调试噩梦。
  • 完整的 SSH2 协议:密钥交换、通道、SFTP 子系统、端口转发
  • ChaCha20-Poly1305 和 AES-GCM 加密套件,Ed25519/RSA/ECDSA 密钥
  • 自定义 AgentSigner:封装系统 SSH Agent 并实现 russh 的 Signer trait,通过在 .await 前将 &AgentIdentity 克隆为 owned 值,解决 RPITIT Send 约束问题
pub struct AgentSigner { /* wraps system SSH Agent */ }
impl Signer for AgentSigner { /* challenge-response via Agent IPC */ }
  • 平台支持:Unix(SSH_AUTH_SOCK)、Windows(\\.\pipe\openssh-ssh-agent
  • 代理链:每一跳独立使用 Agent 认证
  • 重连AuthMethod::Agent 自动重放

🔄 智能重连与宽限期

大多数 SSH 客户端在断线时会销毁一切然后从头开始。OxideTerm 的重连编排器采用了截然不同的策略:

  1. 检测:WebSocket 心跳超时(300 秒,针对 macOS App Nap 和 JS 定时器节流优化)
  2. 快照:完整状态——终端窗格、进行中的 SFTP 传输、活动端口转发、打开的 IDE 文件
  3. 智能探测visibilitychange + online 事件触发主动 SSH keepalive(~2 秒检测 vs 被动超时的 15-30 秒)
  4. 宽限期(30 秒):通过 keepalive 探测旧 SSH 连接——如果恢复成功(例如 WiFi AP 切换),你的 TUI 应用(vim、htop、yazi)完全不受影响
  5. 恢复失败 → 建立新 SSH 连接 → 自动恢复转发 → 恢复 SFTP 传输 → 重新打开 IDE 文件

管线流程:queued → snapshot → grace-period → ssh-connect → await-terminal → restore-forwards → resume-transfers → restore-ide → verify → done

所有逻辑运行在专用的 ReconnectOrchestratorStore 中——零重连代码散落在 hooks 或组件中。

🛡️ SSH 连接池

引用计数的 SshConnectionRegistry,以 DashMap 为底层实现无锁并发访问:

  • 一个连接,多个消费者:终端、SFTP、端口转发和 IDE 共享同一物理 SSH 连接——无冗余 TCP 握手
  • 每连接状态机connecting → active → idle → link_down → reconnecting
  • 生命周期管理:可配置的空闲超时(5 分钟 / 15 分钟 / 30 分钟 / 1 小时 / 永不)、15 秒 keepalive 间隔、心跳故障检测
  • WsBridge 心跳:30 秒间隔、5 分钟超时——兼容 macOS App Nap 和浏览器 JS 节流
  • 级联传播:跳板机故障 → 所有下游节点自动标记为 link_down 并同步状态
  • 空闲断开:向前端发送 connection_status_changed(而非仅内部 node:state),防止 UI 状态不同步

🤖 OxideSens AI

隐私优先的 AI 助手,提供双重交互模式:

  • 内联面板⌘I):快速终端命令,通过 bracketed paste 注入输出
  • 侧边栏聊天:持久对话,完整历史记录
  • 面向目标的工作区上下文:把已保存连接、实时 SSH 会话、终端缓冲区、SFTP 路径、设置和知识库条目视为可操作目标
  • 已批准的动作:可诊断远程输出、执行已批准命令、检查文件并解释故障,无需 OxideTerm 账号
  • MCP 支持:连接外部 Model Context Protocol 服务器(stdio & SSE)进行第三方工具集成
  • RAG 知识库(v0.20):将 Markdown/TXT 文档导入作用域集合(全局或按连接)。混合搜索通过 Reciprocal Rank Fusion 融合 BM25 关键词索引 + 向量余弦相似度。Markdown 感知分块保留标题层级。CJK 双字符分词器支持中文/日文/韩文。
  • 供应商:OpenAI、Ollama、DeepSeek、OneAPI 或任何 /v1/chat/completions 端点
  • 安全:API 密钥存储在 OS 密钥链;macOS 上密钥读取受 Touch ID 通过 LAContext 保护——无需授权签名或代码签名,每次会话首次认证后缓存

端口转发——无锁 I/O

完整的本地(-L)、远程(-R)和动态 SOCKS5(-D)转发:

  • 消息传递架构:SSH Channel 由单一 ssh_io 任务拥有——无 Arc<Mutex<Channel>>,彻底消除互斥锁竞争
  • 终止报告:转发任务主动报告退出原因(SSH 断开、远端端口关闭、超时),提供清晰的诊断信息
  • 自动恢复Suspended 状态的转发在重连时自动恢复,无需用户干预
  • 空闲超时FORWARD_IDLE_TIMEOUT(300 秒)防止僵尸连接堆积

📦 trzsz — 带内文件传输

无需 SFTP 连接,直接通过 SSH 终端会话上传和下载文件:

  • 带内协议:文件以 Base64 编码帧的形式在现有终端流中传输——无需额外端口或 Agent,可透明穿透 ProxyJump 链和 tmux
  • 双向传输:服务端运行 tsz <file> 向客户端发送文件;trz 触发客户端上传;支持拖放
  • 目录支持:通过 trz -d / tsz -d 进行递归目录传输
  • 传输限制:可为每个会话配置分块大小、文件数量和总字节数上限
  • 原生 Tauri I/O:文件读写使用 Tauri 原生文件对话框和 Rust I/O——无浏览器内存限制
  • 实时通知:提供传输开始、完成、取消和错误的 Toast 通知——当检测到 trzsz 但功能未启用时也会给出提示
  • 前往 设置 → 终端 → 带内传输 启用

🔌 运行时插件系统

动态 ESM 加载,安全加固的冻结 API 表面:

  • PluginContext API:18 个命名空间——terminal、ui、commands、settings、lifecycle、events、storage、system
  • 24 个 UI Kit 组件:预构建的 React 组件(按钮、输入框、对话框、表格……)通过 window.__OXIDE__ 注入插件沙箱
  • 安全膜:对所有上下文对象使用 Object.freeze,基于 Proxy 的 ACL,IPC 白名单,熔断器在重复错误后自动禁用
  • 共享模块:React、ReactDOM、zustand、lucide-react 对外暴露供插件使用,无需重复打包

⚡ 自适应渲染

三级渲染调度器,替代固定的 requestAnimationFrame 批处理:

级别触发条件帧率收益
加速帧数据 ≥ 4 KB120 Hz+(ProMotion 原生)消除 cat largefile.log 时的滚动卡顿
正常常规打字60 Hz(RAF)平稳的基准表现
空闲3 秒无 I/O / 标签页隐藏1–15 Hz(指数退避)接近零 GPU 负载,节省电量

级别切换完全自动——由数据量、用户输入和 Page Visibility API 驱动。后台标签页通过空闲定时器持续刷新数据,无需唤醒 RAF。

🔐 .oxide 加密导出

便携、防篡改的连接备份:

  • ChaCha20-Poly1305 AEAD 认证加密
  • Argon2id KDF:256 MB 内存开销、4 次迭代——抵御 GPU 暴力破解
  • SHA-256 完整性校验
  • 可选密钥嵌入:私钥 base64 编码嵌入加密载荷
  • 导出前分析:认证类型分类、缺失密钥检测

📡 ProxyJump——拓扑感知多跳

  • 无限链深度:Client → Jump A → Jump B → … → Target
  • 自动解析 ~/.ssh/config,构建拓扑图,Dijkstra 最短路径寻路
  • 跳板节点可作为独立会话复用
  • 级联故障传播:跳板机宕机 → 所有下游节点自动标记为 link_down

⚙️ 本地终端——线程安全 PTY

跨平台本地 Shell,基于 portable-pty 0.8,通过 local-terminal feature flag 控制:

  • MasterPty 封装在 std::sync::Mutex 中——专用 I/O 线程将阻塞式 PTY 读取隔离在 Tokio 事件循环之外
  • Shell 自动检测:zshbashfishpwsh、Git Bash、WSL2
  • cargo build --no-default-features 可剥离 PTY 功能用于移动端/轻量构建

🪟 Windows 优化

  • 原生 ConPTY:直接调用 Windows Pseudo Console API——完整 TrueColor 和 ANSI 支持,无传统 WinPTY
  • Shell 扫描器:通过注册表和 PATH 自动检测 PowerShell 7、Git Bash、WSL2、CMD

更多功能

  • IDE 模式:CodeMirror 6 基于 SFTP,24 种语言,带 Git 状态的文件树,多标签,冲突解决——Linux 可选远程 Agent(~1 MB)以增强功能
  • 资源分析器:通过持久 SSH 通道读取 /proc/stat 获取实时 CPU/内存/网络数据,基于增量计算,非 Linux 环境自动降级为仅 RTT
  • 自定义主题引擎:30+ 内置主题,可视化编辑器实时预览,20 个 xterm.js 字段 + 24 个 UI 颜色变量,从终端调色板自动推导 UI 颜色
  • 会话录制:asciicast v2 格式,完整录制和回放
  • 广播输入:输入一次,发送到所有分屏窗格——批量服务器操作
  • 背景画廊:每标签页背景图片,16 种标签类型,透明度/模糊/适配控制
  • CLI 伴侣工具oxt):~1 MB 二进制文件,JSON-RPC 2.0 基于 Unix Socket / Named Pipe,status/health/list/forward/config/connect/focus/attach/SFTP/import/AI 支持人类可读或 --json 输出
  • WSL Graphics ⚠️ 实验性:内置 VNC 查看器——9 种桌面环境 + 单应用模式,WSLg 检测,Xtigervnc + noVNC

官方插件

插件说明仓库
Cloud Sync加密自托管同步——通过 WebDAV、HTTP JSON、Dropbox、Git 或 S3 上传和导入 .oxide 快照oxideterm.cloud-sync
Telnet Client原生 Telnet 客户端,用于路由器、交换机和老旧设备——无需外部程序oxideterm.telnet
📸 11 种语言实际展示

English

简体中文

繁體中文

日本語

한국어

Français

Deutsch

Español

Italiano

Português

Tiếng Việt

运行时要求

OxideTerm 使用操作系统提供的原生 WebView 运行时。大多数用户的系统已经预装;只有在应用无法启动或处于离线/内网环境时,才需要手动安装。

平台运行时依赖
WindowsWebView2 运行时 — 已预装于 Windows 10(1803+)和 Windows 11。对于离线 / 内网环境,请使用 Evergreen 独立安装程序(离线安装,约 170 MB),或通过组策略部署固定版本运行时。
macOS无(使用原生 WebKit)
Linuxlibwebkit2gtk-4.1(现代桌面环境通常已预装)

便携模式

OxideTerm 支持完全自包含的便携模式——所有数据(连接、密钥、设置)存储在应用程序二进制文件旁边,适用于 USB 驱动器或离线环境。

激活方式

方式 A — 标记文件(最简单):在应用程序旁创建一个名为 portable 的空文件(无扩展名)。

平台portable 文件放置位置
macOSOxideTerm.app 旁边(同级目录)
WindowsOxideTerm.exe 旁边
Linux (AppImage).AppImage 文件旁边
/my-usb/
├── OxideTerm.app   (or .exe / .AppImage)
├── portable        ← 你创建的空文件
└── data/           ← 首次启动时自动创建

方式 B — portable.json(自定义数据目录):在相同位置放置一个 portable.json

{
  "enabled": true,
  "dataDir": "my-data"
}
  • enabled 省略时默认为 true
  • dataDir 必须是相对路径(不能包含 ..);省略时默认为 data

工作原理

  1. 首次启动 — 引导界面会提示你创建便携密码。此密码用于加密本地密钥库(ChaCha20-Poly1305 + Argon2id),保护所有已保存的密钥。
  2. 后续启动 — 输入密码解锁。在支持 Touch ID 的 macOS 上,你可以在 Settings → General → Portable Runtime 中启用生物识别解锁。
  3. 实例锁 — 同一时间只有一个 OxideTerm 实例可以使用便携数据目录(data/.portable.lock)。
  4. 管理 — 在 Settings → General → Portable Runtime 中更改便携密码或切换生物识别解锁。
  5. 可移植性 — 将整个文件夹(应用 + portable 标记 + data/)复制到另一台机器即可使用。密码随密钥库一起携带。

Tip

便携模式下自动更新已禁用。如需更新,替换应用程序二进制文件,保留 data/ 目录即可。


快速开始

前置要求

  • Rust 1.85+
  • Node.js 18+(推荐 pnpm)
  • 平台工具
    • macOS:Xcode Command Line Tools
    • Windows:Visual Studio C++ Build Tools
    • Linux:build-essentiallibwebkit2gtk-4.1-devlibssl-dev

开发

git clone https://github.com/AnalyseDeCircuit/oxideterm.git
cd oxideterm && pnpm install

# 构建 CLI 伴侣工具(CLI 功能必需)
pnpm cli:build

# 完整应用(前端 + Rust 后端,热重载)
pnpm run tauri dev

# 仅前端(Vite 运行在端口 1420)
pnpm dev

# 生产构建
pnpm run tauri build

技术栈

层级技术详情
框架Tauri 2.0原生二进制,25–40 MB
运行时Tokio + DashMap 6全异步,无锁并发映射
SSHrussh 0.59(ring纯 Rust,零 C 依赖,SSH Agent
本地 PTYportable-pty 0.8Feature 门控,Windows 上使用 ConPTY
前端React 19.1 + TypeScript 5.8Vite 7,Tailwind CSS 4
状态Zustand 519 个专用 Store
终端xterm.js 6 + WebGLGPU 加速,60fps+
编辑器CodeMirror 630+ 语言模式
加密ChaCha20-Poly1305 + Argon2idAEAD + 内存硬化 KDF(256 MB)
存储redb 2.1嵌入式 KV 存储
国际化i18next 2511 种语言 × 22 个命名空间
插件ESM 运行时冻结 PluginContext + 24 UI Kit
CLIJSON-RPC 2.0Unix Socket / Named Pipe

项目规模

使用 tokei 统计,已排除依赖和构建产物。

指标当前规模
总代码量286K+
TypeScript / TSX130K+
Rust100K+
前端测试代码24K+
前端测试文件128
源文件(src + src-tauri/src664

安全

关注点实现方式
密码OS 密钥链(macOS Keychain / Windows Credential Manager / libsecret)
便携式密钥库ChaCha20-Poly1305 加密保险库,位于应用程序旁边,可选通过 OS 密钥链绑定生物识别
AI API 密钥OS 密钥链 + macOS 上的 Touch ID 生物识别保护
导出.oxide:ChaCha20-Poly1305 + Argon2id(256 MB 内存,4 次迭代)
内存Rust 内存安全 + zeroize 敏感数据清除
主机密钥TOFU 验证 ~/.ssh/known_hosts,拒绝变更(防中间人攻击)
插件Object.freeze + Proxy ACL,熔断器,IPC 白名单
WebSocket一次性令牌,带时间限制

路线图

  • SSH Agent 转发
  • 完整 ProxyCommand 支持
  • 审计功能
  • Agent 增强
  • 会话搜索与快速切换
  • 通过 GPUI(Zed 的 GPU 加速框架)进行 Rust 原生迁移 — [进行中]

支持与维护

Bug 报告和可复现的回归问题会优先处理。功能请求会根据范围、安全性以及是否符合 OxideTerm 的远程服务器工作区方向来评估。

如果 OxideTerm 帮到了你的工作流,GitHub Star、问题复现、翻译修正、插件或 Pull Request 都能让项目更容易继续前进。


许可证

GPL-3.0 — 本软件是按照 GNU 通用公共许可证 v3.0 发布的自由软件。

您可以在 GPL-3.0 条款下自由地使用、修改和分发本软件。任何衍生作品也必须在由同一许可证下发布。

OxideTerm 从 v1.0.0 起由 PolyForm Noncommercial 1.0.0 切换到 GPL-3.0。我们主动做这个转换,就是为了不玩带非商用陷阱或竞业禁止附加条款的“开源 cosplay”,而是把用户、fork、再分发者和商业使用者的 copyleft 自由说清楚。

公开代码不自动等于开源。如果一个项目一边挂着常见开源许可证,一边额外写上“禁止再分发”“禁止重新打包”“禁止做竞争产品”“禁止未经授权的平台分发”这类附加条款,那它更接近 source-available 的营销话术,而不是用户通常理解的开源自由。OxideTerm 不添加竞业禁止或反分发附加条款:GPL-3.0 条款就是全部条款。

完整文本:GNU 通用公共许可证 v3.0


致谢

russh · portable-pty · Tauri · xterm.js · CodeMirror · Radix UI


286,000+ 行代码——以 ⚡ 和 ☕ 构建

Star History

Star History Chart