EllS

一个活在终端里的轻量级跨平台 SSH 客户端。

纯 Rust 编写,在高速 TUI 里内嵌一个真正的终端模拟器:远程会话的颜色、vim / htop 都能正确渲染。同时补齐了原生 ssh 命令缺少的工作流能力——加密凭据保险库、SFTP 文件浏览、Xshell 风格的 sz/rz 传输拦截,全部只需几个按键或一次鼠标点击。

正在识别你的系统…
irm https://raw.githubusercontent.com/lg10/ells/main/install.ps1 | iex

在 PowerShell 里运行;脚本会强制校验 SHA256SUMS.txt,校验不过直接退出。

装完重新打开终端,ells 与短命令 s 就能直接用。

  • MIT 开源
  • Windows · macOS · Linux
  • 零遥测
  • 单文件二进制,无运行时依赖
ells-主机列表 80 × 24
 ells 主机列表 · v0.1.7 · 构建 2026-10-06 09:12【v0.1.8 可更新】官网(ells.cn)
1:pay-api │ 2:db-prod │ 3:mysql-cache │ +  F2 新建 · F5/F6 切换 · Ctrl-] 关闭标签
●pay-apideploy@203.0.113.24:22[密码]
●db-prodbackup@198.51.100.7:22[密钥]经 bastion
○mysql-cacheappuser@198.51.100.30:22[密码]
·staging-01ci@203.0.113.101:22[密钥]
·edge-hksvc@203.0.113.55:22[密码]
 ● 已连接(Enter 或点顶部标签切回那一格)· ○ 正在连接 · 断开用 Ctrl-](只断这一格)
 ↑↓ 选择 · Enter 连接/切回 · a 新增 · e 编辑 · d 删除 · i 导入 · s 设置 · ? 帮助 · q 退出 【设置】

主机列表:一行一台服务器,● 表示已经连着,Enter 直接连或切回那一格标签。

🔒 本站的界面图按 EllS 真实渲染逐字还原;其中的主机地址与用户名一律替换为文档保留地址(203.0.113.0/24、198.51.100.0/24)与示例账号,不含任何真实 IP。

它能做什么

EllS 不做 GUI,也不接管你的终端模拟器;它把 SSH 工作流里那些"原生 ssh 缺的东西"补齐成几个按键或一次点击。

🔐

加密保险库

主机与密码存于 ~/.ells/vault.bin,由主密码保护:Argon2id 派生密钥 + XChaCha20Poly1305 认证加密。支持免密自动解锁、应用内改主密码。

🗂

主机管理与跳板机

别名、按主机的认证方式(密码 / 私钥)、备注,以及 ProxyJump 跳板:ells → 跳板 → 目标,内置循环检测。

⌨️

私钥格式通吃

PKCS#8、PKCS#1 RSA、OpenSSH 格式,连旧式 DEK-Info / 3DES 加密 PEM 也由 EllS 原生解密,不用先转格式。

🖥

内嵌真终端

vt100 模拟器完整支持 ANSI / 256 色 / 真彩色,vim、htop 正常显示。Ctrl-Q 一键切直通模式当逃生门,Ctrl-L 重绘。

📦

sz / rz 拦截

在远端输出流做协议级 ZMODEM 握手检测(针对真实 lrzsz 字节流反复调校),自动改走 SFTP 通道:有进度条、有系统原生文件对话框,远端不需要 ZMODEM 服务端配合。

📁

SFTP 文件浏览器

会话内 Ctrl-S 打开:Enter 进入/下载、u 上传、d 下载,支持鼠标点击与滚轮,顶部聚合进度条 + 传输详情弹窗。

🎨

输出高亮

docker ps 按列分色(容器 ID / 镜像名 / 版本标签 / 容器名各一档,命令弱化),还有 kubectl、日志级别、HTTP 方法、IPv4、百分比即时着色——且绝不覆盖程序自己发出的 ANSI 颜色。

🪟

多会话标签页

一个进程同时挂多台服务器:F2 新建、F5/F6 或点标签切换、Ctrl-] 关闭。后台标签的输出与传输继续跑,切回来还在。

🔑

主机密钥 TOFU

首次连接确认并记入 ~/.ells/known_hosts(OpenSSH 兼容格式,也读 ~/.ssh/known_hosts);密钥变化时阻断告警。批量场景用 -y 只放行首次,密钥变更仍然拒绝。

🔄

应用内更新

启动时后台查一次新版(一个 HEAD 请求,不占匿名 API 限额),顶部出可更新徽标;点一下确认就下载、按 SHA256SUMS.txt 流式校验后原地替换自身,校验不过绝不替换。

🔌

空闲保活 · 鼠标友好

可配置 SSH keepalive(15–300 秒)扛住云服务器 NAT 空闲断连;拖选复制(OSC 52)、滚轮回看历史且保留颜色、各界面元素可点击。

🌏

全中文界面 · 可选主题

界面全中文、系统原生文件对话框、零遥测;配色抽成主题层,四套主题(深色 / 跟随终端 / 高对比 / 浅色底)即时预览。主机列表按 i 还能一键导入 ~/.ssh/config。

界面长什么样

每一屏都是纯键盘 + 可鼠标点击的双轨操作;下面五张图对应真实渲染的文案与配色。

ells-pay-api96 × 30
 ells ● pay-api · deploy@203.0.113.24:22 ● 内嵌 Ctrl-Q 切模式 · Ctrl-S 文件 · Ctrl-L 重绘 · F3 搜索 · Ctrl-G 列表
1:pay-api │ 2:db-prod │ +  F2 新建 · F5/F6 切换 · Ctrl-] 关闭标签
 点击上方按钮或输入 sz/rz 传输文件 · 滚轮回看输出 · 拖选复制
【设置】【上传】【下载】【列表】传输进度 (2/5)43%
deploy@pay-api:~$ docker ps
CONTAINER IDIMAGECOMMANDSTATUSPORTSNAMES
9f2c1a7b3d4enginx:1.27"/docker-entrypoint.…"Up 3 days80/tcpweb-nginx
3b7e9c21d5a0registry.example.net:5000/pay/app:2.1"java -jar app.jar"Restarting (1) 3 hours ago9000/tcppay-gateway
a1c9f04e2b77redis:7.2"docker-entrypoint.s…"Up 2 weeks6379/tcpcache-01
deploy@pay-api:~$ tail -f /var/log/app/deploy.log
2026-10-06 09:14:22 ERROR upstream connect timeout to 198.51.100.30:6379 (retry 45%)
2026-10-06 09:14:25 INFO GET /health 200 up=99.98%
2026-10-06 09:14:31 WARNING image pull backoff: registry.example.net:5000/pay/app:2.1
deploy@pay-api:~$ ▏
会话 + 输出高亮:docker ps 的容器 ID / 镜像名 / 版本标签 / 容器名各归一档,日志级别、HTTP 方法、IPv4、百分比即时着色;时间戳和 COMMAND 弱化成灰,眼睛只看该看的地方。
ells-远程文件90 × 24
 远端文件 /var/log 12 项【设置】【上传】【下载】【列表】
1:pay-api │ 2:db-prod │ +  F2 新建 · F5/F6 切换 · Ctrl-] 关闭标签
nginx/
supervisor/
app/
deploy.log4.2MB
access.log118.3MB
k8s-audit.log22.0KB
cert-rotate.txt512B
 ↑↓/滚轮 选择 · Enter 进入/下载 · u 上传文件 · U 上传目录 · d 下载 · m 新建目录 · n 重命名 · D 删除 · Ctrl-C 取消传输 · r 刷新 · Esc 返回终端 
SFTP 文件浏览器:目录青色、文件正常色,Enter 进入或下载;传输详情弹窗里每条任务的字节数与实时速率都能看到,Ctrl-C 一次取消全部在途传输。
ells-主机列表72 × 24
 ells 主机列表 · v0.1.7 · 构建 2026-10-06 09:12
全局设置:高亮开关、保活间隔、主密码保护、快捷键改键、界面主题、自动更新都在这一屏,改完点【保 存】才写入 ~/.ells/settings.ini。
ells-主机列表72 × 24
 ells 主机列表 · v0.1.7 · 构建 2026-10-06 09:12【v0.1.8 可更新】
●pay-apideploy@203.0.113.24:22[密码]
●db-prodbackup@198.51.100.7:22[密钥]经 bastion
 ↑↓ 选择 · Enter 连接/切回 · a 新增 · e 编辑 · d 删除 · i 导入 · s 设置 · ? 帮助 · q 退出 
应用内更新:点顶部徽标 → 确认 → 边下边算 SHA256,与 SHA256SUMS.txt 比对通过才原地替换自身;下载途中随时可取消,临时文件不留。
ells-解锁保险库72 × 20
首次运行:设置主密码并创建保险库。EllS 把这条风险写在最显眼处——主密码没有任何找回途径,它也绝不会离开本机。

安装

一行命令搞定:脚本会挑对平台与架构、强制校验 SHA256SUMS.txt、把二进制放进 PATH,并注册短命令 s。校验不过直接退出,不会留下半个文件。

一行安装

在 PowerShell(Win 10/11 自带)里运行:

irm https://raw.githubusercontent.com/lg10/ells/main/install.ps1 | iex
  • 产物是 ells.exe;正在运行的旧版本改名成 ells.exe.old,下次启动自动清掉。
  • s 短命令通过 PowerShell 配置文件里的函数注册;cmd 无需额外处理。
  • 请用 Windows Terminal:旧版 conhost 对鼠标与 OSC 52 剪贴板支持不佳。

在终端(bash / zsh)里运行:

curl -fsSL https://raw.githubusercontent.com/lg10/ells/main/install.sh | sh
  • 发布物是 ells-macos-universal 通用二进制,Intel 与 Apple Silicon 都由同一行命令装好,脚本会自动挑对。
  • mac 上默认主题自动是「跟随终端(不画底色)」,不会出现灰底黑块。
  • 推荐 iTerm2:系统自带终端不支持 OSC 52 剪贴板;默认把功能键当媒体键,按 F2/F3 需要 fn,或到系统设置里改。

在终端(bash / zsh)里运行:

curl -fsSL https://raw.githubusercontent.com/lg10/ells/main/install.sh | sh
  • x86_64 有预编译包 ells-linux-x86_64;aarch64 请从源码构建(见下)。
  • 原生文件对话框需要桌面会话(X11 / Wayland),纯无头 TTY 弹不出来——用 s <别名> 直连与 SFTP 快捷键不受影响。
  • GNOME / KDE 终端常占用 F10/F11,需要在终端偏好里放开。

指定版本 / 安装目录 / 内网镜像

用环境变量覆盖,安装脚本与应用内更新共用同一套约定:

# macOS / Linux:装指定版本、装到指定目录
ELLS_VERSION=v0.1.7 curl -fsSL https://raw.githubusercontent.com/lg10/ells/main/install.sh | sh
ELLS_INSTALL_DIR=/usr/local/bin curl -fsSL https://raw.githubusercontent.com/lg10/ells/main/install.sh | sh
# Windows PowerShell
$env:ELLS_VERSION='v0.1.7'; irm https://raw.githubusercontent.com/lg10/ells/main/install.ps1 | iex
$env:ELLS_INSTALL_DIR="$env:USERPROFILE\bin"; irm https://raw.githubusercontent.com/lg10/ells/main/install.ps1 | iex

ELLS_API_URL 换版本查询端点、ELLS_DOWNLOAD_URL 换资产基址,就能指向内网镜像。安装出问题时先跑 sh diagnose.sh,它会打印本机 shell / curl / 架构 / 代理的判定结果。

从源码构建

需要 Rust 1.85+(edition 2024)。代码库不含平台特定实现:crypto 统一用 ring,终端栈纯 Rust。

cargo build --release -p ells
./target/release/ells            # 主机列表
./target/release/ells myserver   # 按别名直接连接

Linux 源码构建需先装系统依赖 pkg-config libwayland-dev(文件选择对话框走 XDG 门户时依赖 wayland);预编译二进制与一行安装不需要这一步。

卸载

curl -fsSL https://raw.githubusercontent.com/lg10/ells/main/uninstall.sh | sh
# 连 ~/.ells 一起删(不可恢复):
curl -fsSL https://raw.githubusercontent.com/lg10/ells/main/uninstall.sh | sh -s -- --purge
irm https://raw.githubusercontent.com/lg10/ells/main/uninstall.ps1 | iex
$env:ELLS_PURGE='1'; irm https://raw.githubusercontent.com/lg10/ells/main/uninstall.ps1 | iex

卸载只清理二进制、PATH 条目和 PowerShell 里的 s 函数,默认保留 ~/.ells(保险库、known_hosts、设置)——删二进制不该顺手毁掉凭据。EllS 不写注册表。确认不再需要这些主机时才用 --purge / ELLS_PURGE=1。

怎么用

第一次上手只需五步;之后的日常就是 s + 几个按键。

  1. 装好,重新打开终端

    PATH 由脚本配置,所以要开新窗口。ells 与短命令 s 等价。

  2. 设置主密码,创建保险库

    首次运行会引导你设主密码并创建 ~/.ells/vault.bin。之后每次启动输入主密码解锁,也可以在设置里关掉保护改成免密自动解锁(凭据仍只在本机加密保存)。

  3. 按 a 添加主机,回车连接

    表单里填别名、主机、端口、用户、认证方式(←/→ 切换密码 / 密钥)与备注;Ctrl-F 选私钥、Ctrl-J 选跳板机。已有 OpenSSH 配置的主机,在列表按 i 一键从 ~/.ssh/config 导入。首次连接会走主机密钥 TOFU:核对指纹后接受并记录,密钥日后变化会阻断告警。

  4. 在会话里干活

    Ctrl-S 开 SFTP 文件浏览器(u 上传、d 下载、m 新建目录、n 重命名、D 删除);远端敲 sz/rz 也会被 EllS 拦下来改走 SFTP,弹出系统原生文件对话框。滚轮回看输出、拖选即复制、F3 搜索历史、Ctrl-Q 切直通模式、Ctrl-G 保持连接回列表。

  5. 多开标签,新版本自己冒出来

    F2 新建标签挂下一台服务器,F5/F6 或点标签切换;后台标签的输出与传输继续跑。有新版本时列表顶部出现 【vX.Y.Z 可更新】 徽标,点一下确认就下完并换好,重启即生效。

命令行参数

ells [ALIAS] [--dev] [-y] [--check-update]
ALIAS解锁后立即连接该别名对应的主机(s <别名> 同义)
--dev从 ~/.ells/hosts.dev.toml 读取明文主机表(仅开发调试,不做持久化)
-y, --yes首次见到的主机密钥自动接受并记录;密钥变更时仍然拒绝
--check-update只检查有没有新版本,打印结果就退出(不下载、不启动界面)

环境变量与配置文件

ELLS_LOG=1把内部日志写到 stderr
ELLS_ZMODEM_LOG=1额外把 sz/rz 拦截诊断写入 ~/.ells/zmodem.log
ELLS_YES=1等价于 -y
ELLS_API_URL
ELLS_DOWNLOAD_URL
把版本查询与下载地址换成内网或镜像源(与安装脚本同一套约定)
ELLS_VERSION
ELLS_INSTALL_DIR
安装脚本用:指定版本、指定安装目录

配置都在 ~/.ells/:vault.bin(保险库)、settings.ini(设置与主题)、known_hosts(主机密钥记录,OpenSSH 兼容)、update.cache(上次更新检查,只有版本与时间两行,不含任何主机信息)。

应用内更新做了什么

EllS 每次启动都在后台问一次"有没有新版本"——只发一个 HEAD 请求、从 GitHub 的重定向地址读版本号,不下载任何内容,也不占匿名 API 限额。点徽标确认后按顺序做四件事:

  1. 下载本平台对应的发布资产到 EllS 所在目录的临时文件。
  2. 边下边算 SHA256,和 SHA256SUMS.txt 比对;校验不过(或没下完)就删掉临时文件,绝不替换。
  3. 原地换上新二进制。Windows 上运行中的镜像删不掉但能改名,于是先改成 ells.exe.old 再换进去,本次会话照常跑完;换失败会原样改回来。
  4. 提示"新版本已就位"——盘上是新的了,进程还是旧的,点【立即重启】或按 Enter 换新安。确认框会先说明这会断开手上几路会话。

不想让它自己查:进设置把「自动更新」按 ← 关掉(写入 auto_update=false),之后仍可在同一行按 Enter 手动检查。启动那次自动检查失败是静默的(没网不该拦人),只有你主动检查才会看到中文的失败原因。没有预编译包的平台(例如 Linux aarch64)不会尝试自替换,而是提示改用安装脚本。

快捷键

表中这些标签与会话组合键(F2/F5/F6/Ctrl-]/Ctrl-G/Ctrl-S/Ctrl-Q/Ctrl-L/F3)都只是默认值,可在「主机列表 s → 设置 → 快捷键设置」里改:选中一项按 Enter 录制,只接受 F2–F9 或带 Ctrl/Alt 的组合键,撞上已占用的键时两个动作自动互换,改完即时生效并写入 settings.ini。

  • ↑↓jk选择主机
  • Enter连接(这台已连着就切回它那一格标签)
  • a新增主机
  • e编辑主机
  • d删除(二级确认)
  • s打开设置
  • i导入 ~/.ssh/config
  • ?F1完整键位帮助页
  • qCtrl-C退出

行首 ● 已连接 / ○ 正在连接 / · 空闲;顶部标签条点一下就切回去。

  • F2新建标签
  • F5下一个标签
  • F6上一个标签
  • Ctrl-]关闭当前标签(只剩一个时退回主机列表;有传输在跑时要按两次)
  • Ctrl-G保持连接回到主机列表,再按一次回到原来那一页
  • 🖱鼠标点顶部标签切换、点末尾 + 新建
  • ⌨任意按键直达远端
  • Ctrl-Q内嵌 / 直通切换
  • Ctrl-S打开 SFTP 浏览器
  • Ctrl-L重绘
  • F3搜索历史输出(回看时按 / 同样可用,n/N 跳上下条)
  • 🖱 滚轮回看历史且保留颜色
  • 🖱 拖选复制(OSC 52)
  • F1帮助

面板底部会按当前平台提示该终端自己的占用情况:Windows Terminal 占 Ctrl+1–8 与 F11;macOS 默认把功能键当媒体键,要按 fn;把 Option 设为 Meta 才能用 Alt 组合;GNOME/KDE 终端占用 F10/F11。

  • Enter进入目录 / 下载
  • u上传文件
  • U上传整个目录
  • d下载
  • m新建目录
  • n重命名
  • D删除(递归,先确认)
  • Ctrl-C取消全部在途传输
  • r刷新
  • Backspace返回上级
  • Esc返回终端
  • Tab↑↓切换输入项
  • ←→切换认证方式
  • Ctrl-F选私钥
  • Ctrl-J选跳板机
  • Enter在"私钥路径 / 跳板机"上直接打开选择器
  • Esc在确认弹窗里取消;←→/Tab 切换选项,Enter 确认

保存点【保 存】按钮或回车;私钥口令只在私钥本身加密时才需要填。

界面配色也可选:「主机列表 s → 设置 → 界面主题」按 Enter 或 ←→ 循环四套——深色(画死底色) 黑底灰条,Windows 上最贴;跟随终端(不画底色) 底与正文色都用终端自己的主题,macOS 终端 / iTerm2 / WezTerm 推荐,也是 mac 上的默认;高对比 去掉灰色小字,层级靠粗体与反显;浅色底 给白底终端的深字配色。改完立刻预览,点【保 存】才写入 settings.ini 的 theme=。

常见问题

忘了主密码怎么办?

没有任何找回途径——EllS 不做找回,也不会把密码发往任何服务器。只能重置保险库重来,主机与凭据都要重填。这也是首次运行那屏把警告写在最上面的原因。觉得每次输密码麻烦,可以在设置里关掉主密码保护,改成启动自动解锁(凭据仍以 Argon2id + XChaCha20Poly1305 加密存在本机 vault.bin)。

凭据到底存在哪、会不会上传?

只存本机 ~/.ells/vault.bin。密码派生密钥用 Argon2id,加密用 XChaCha20Poly1305 认证加密。零遥测:没有埋点、没有上报,版本检查只有一个面向 GitHub 发布页的 HEAD 请求。

高亮会不会盖掉程序自己输出的颜色?

不会。高亮只作用于"默认前景色"的单元格,程序自己发出的 ANSI 颜色一律保留;设置里也能整屏关掉(「终端输出高亮」)。判据也刻意收紧:docker ps 只认行首正好一段 12 位(或 --no-trunc 的 64 位)小写十六进制 ID,git 的 7~8 位短哈希不会被误染;镜像版本只看最后一个 / 之后的冒号,所以 registry.corp.com:5000/pay/app:2.1 里端口号不会被当成版本。

远端需要装 lrzsz 吗?

不需要服务端配合。EllS 在远端输出流里做协议级 ZMODEM 握手检测,识别到 sz/rz 意图后改走 SFTP 通道传输,所以你既有 Xshell 那种"敲 sz 就弹框"的手感,又有真实进度条与系统原生文件对话框。

内嵌终端显示某个全屏程序不对,怎么办?

先 Ctrl-L 重绘;仍不对就按 Ctrl-Q 切直通模式——此时 EllS 不再解释字节流,把终端原样交给远端程序,这是刻意保留的兜底逃生门。注意直通模式下远端独占屏幕,要回主机列表得先按 Ctrl-Q 回内嵌。

为什么推荐 Windows Terminal / iTerm2?

旧版 conhost 对鼠标事件与 OSC 52 剪贴板支持不佳,macOS 自带终端不支持 OSC 52(拖选复制会失效)。另外 mac 上 ells 的窗口标题、标签页标题会随页面联动(连接后显示 ells-别名),在支持的终端里最直观。

Linux aarch64、或者完全无桌面的机器?

aarch64 目前没有预编译包:请从源码构建(cargo build --release -p ells),应用内更新也不会尝试自替换,而是提示改用安装脚本。无桌面会话时原生文件对话框弹不出来,纯无头 TTY 尤其如此;连 SSH、传文件(SFTP 快捷键)本身不受影响。

安装 / 更新失败先看什么?

跑 sh diagnose.sh,它会打印本机 shell / curl / 架构 / 代理等判定结果。ells --check-update 只查版本、打印结果就退出,供脚本与排障用。设 ELLS_LOG=1 让内部日志写到 stderr,ELLS_ZMODEM_LOG=1 把 sz/rz 拦截诊断写入 ~/.ells/zmodem.log。反馈问题时请先升级到最新版,并抹掉日志里的主机地址、路径与用户名。

EllS 现在是成熟版本吗?

还在早期:v0.1.x,可能有 Bug、功能尚不完善,欢迎提 Issue。已落地主机密钥 TOFU、三平台预编译包、多会话标签页、主题层与应用内更新;路线图上还差 ssh-agent 认证(目前支持密码与私钥,含私钥口令)。每个版本的细项见 CHANGELOG。

三分钟装好,一个终端管所有服务器

MIT 开源 · 单文件二进制 · 零遥测 · Windows / macOS / Linux。