Repository navigation
Releases: lg10/ells
Release list
ells v0.2.8
ells v0.2.8
一键安装 / Install
macOS / Linux:
ELLS_VERSION=v0.2.8 curl -fsSL https://raw.githubusercontent.com/lg10/ells/main/install.sh | shWindows PowerShell:
$env:ELLS_VERSION="v0.2.8"; irm https://raw.githubusercontent.com/lg10/ells/main/install.ps1 | iex安装脚本会强制校验 SHA256SUMS.txt。产物:ells-linux-x86_64 · ells-macos-universal(x86_64 + Apple Silicon 合一)· ells-windows-x86_64.exe · SHA256SUMS.txt
[0.2.8] - 2026-11-04
新增
- 端口直接铺在容器下面:容器视图的每个端口映射单独一行(
8080 → 80/tcp · 全网可达),
默认露出 3 条,多出来的折成+N;点击选中行或按空格展开全部,再操作一次收起,展开状态
跨刷新保留。表格各列之间留了 2 格空档,ID 和名称不再贴在一起。 - 回车打开操作菜单:详情永远排第一,其余按容器状态给——运行中(重启 / 停止 / 暂停 /
强制停止)、已暂停(继续 / 停止)、已停止(启动 / 删除)。停止、重启、强制停止、删除都要
二次确认;动作优先走 Docker Engine API,只有 socket 通道建不起来时才回落dockerCLI,
避免重启/停止被执行两次。端口中心那页回车也作用于映射所属的容器。 - 容器详情弹窗:inspect 的名称、镜像、状态与健康、创建/启动时间、运行时长、重启策略、
退出码,配上一次性的 CPU / 内存 / 网络 / 进程 / 磁盘 I/O,以及网络、端口、挂载、命令,
分区排版在同一个弹窗里;内容超屏可滚动,c复制整份详情。
完整历史:CHANGELOG.md · 安全策略:SECURITY.md · 安装选项与卸载:README
ells v0.2.7
ells v0.2.7
一键安装 / Install
macOS / Linux:
ELLS_VERSION=v0.2.7 curl -fsSL https://raw.githubusercontent.com/lg10/ells/main/install.sh | shWindows PowerShell:
$env:ELLS_VERSION="v0.2.7"; irm https://raw.githubusercontent.com/lg10/ells/main/install.ps1 | iex安装脚本会强制校验 SHA256SUMS.txt。产物:ells-linux-x86_64 · ells-macos-universal(x86_64 + Apple Silicon 合一)· ells-windows-x86_64.exe · SHA256SUMS.txt
[0.2.7] - 2026-11-04
新增
- 容器视图(F4):会话页按 F4 打开一个只读面板,列出这台机器上的 Docker 容器(名称、镜像、
状态、端口)。数据优先通过 SSH 的direct-streamlocal直连/var/run/docker.sock走 Docker
Engine API,服务器不允许 streamlocal 或 socket 路径不同(Socket 那一路只花一半预算,留时间给兜底)
时自动退回docker ps --format '{{json .}}';两条路都拿不到才报错,不会把"没装 Docker"说成
"没有容器"。面板里↑↓选择、Enter 展开选中容器的端口、Tab/p切到端口中心(只列已发布的
映射,0.0.0.0/::通配双绑折叠成一条,按宿主端口升序,全网可达的绑定点红)、a在
"仅运行中 / 含已停止"之间切换、r刷新、c复制选中行(TSV,可直接粘进表格)、Esc关闭。
远端屏幕上的docker ps原样保留不动,只在底栏提示一句"F4 打开容器视图",12 秒后自动收起。
修复
- 跨屏拖选到边界后还能继续来回调:自动滚动撞到历史顶端(或实时底部)时,以前会顺手把拖选
状态清掉,于是鼠标往回走既不缩短也不加长,松手也不会复制。现在只在"这个方向确实滚不动"时
停掉定时器,拖选状态一直保留到松手;往回拖进可见区即可重新调整端点,反向越界则往回滚。
完整历史:CHANGELOG.md · 安全策略:SECURITY.md · 安装选项与卸载:README
ells v0.2.6
ells v0.2.6
一键安装 / Install
macOS / Linux:
ELLS_VERSION=v0.2.6 curl -fsSL https://raw.githubusercontent.com/lg10/ells/main/install.sh | shWindows PowerShell:
$env:ELLS_VERSION="v0.2.6"; irm https://raw.githubusercontent.com/lg10/ells/main/install.ps1 | iex安装脚本会强制校验 SHA256SUMS.txt。产物:ells-linux-x86_64 · ells-macos-universal(x86_64 + Apple Silicon 合一)· ells-windows-x86_64.exe · SHA256SUMS.txt
[0.2.6] - 2026-11-04
新增
- 底栏能同时看到多块挂载盘:以前底部只显示使用率最高的那一块盘,其余的挂载点只能自己上机
df。
现在普查会把整张挂载点表留在本地,底栏按使用率平铺最多 3 块(每块一根压缩后的小条,三段条宽合计
仍是 12 格,整段面积不超过单盘现状的 120%),放不下的用+N交代。窄屏依次缩短挂载点名、减到两块,
最后一律退回原来的单盘布局,百分比和报警配色不会丢。 - 点击磁盘那一段弹出全部挂载点:面板列出每块盘的挂载点、使用率、已用和总量,按使用率降序;
Esc、q或点击面板外关闭。 - 终端里双击选词:500ms 内同一格双击会选中整段路径/URL(
/var/log/nginx/error.log:42、
root@10.0.0.2:/etc/hosts都算一整串),松手即按 OSC 52 复制。空格、引号、括号、逗号分号、
! | ^ $ *和制表线是分隔符,点在它们上面不选词。单击只清空选区,不再把光标下的一个字符
偷偷写进剪贴板;双击按住时鼠标抖动也不会把整词缩回一个点。 - 拖选可以跨屏、跨历史:把指针拖出终端区就会自动滚动,越出边界越远滚得越快(每 50ms
一跳,步长 1 + 越界行数,封顶 12 行),松手即复制;指针停在区外不动也会继续滚。选区端点
存的是"内容行号"而不是屏幕行,所以滚出去的日志行仍在选区内,长日志不再需要分段复制。
滚到头会停表,松手事件丢在窗口外也不会一直滚。
修复
- 终端拖选改为按阅读顺序选中:以前拖出来的只是一个矩形块,跨行复制会把行首行尾的无关文字也带上。
现在按普通终端/编辑器的习惯流动:首行从起点到行尾、中间各行整行、末行从行首到终点;反向拖动
得到同一段文本,高亮和复制内容也一致。 - 停在上翻视图时不再被新日志顶回底部:vt100 在视图上翻时会随新输出自动加大回看偏移,而 ells
仍按缓存的旧偏移绘制,日志一刷就把视图弹回实时底部。现在每次收到新输出都把这个偏移同步回来,
正在看的历史不会被冲走,跨屏拖选也不会中途跑偏。
完整历史:CHANGELOG.md · 安全策略:SECURITY.md · 安装选项与卸载:README
ells v0.2.5
ells v0.2.5
一键安装 / Install
macOS / Linux:
ELLS_VERSION=v0.2.5 curl -fsSL https://raw.githubusercontent.com/lg10/ells/main/install.sh | shWindows PowerShell:
$env:ELLS_VERSION="v0.2.5"; irm https://raw.githubusercontent.com/lg10/ells/main/install.ps1 | iex安装脚本会强制校验 SHA256SUMS.txt。产物:ells-linux-x86_64 · ells-macos-universal(x86_64 + Apple Silicon 合一)· ells-windows-x86_64.exe · SHA256SUMS.txt
[0.2.5] - 2026-10-21
修复
- Tab 补全出来的路径不再被记成半截,
rz/sz改走的 SFTP 会落到真正所在的目录:readline 的补全
是"重画"而不是"追加" —— 补全时会发一串\b、ESC[K和 BEL,把候选路径就地改写。旧的回显行
解析把 BEL 当成了行结束,于是cd /data/wwwr<BEL>oot/ktop…被当成了已提交的cd /data/wwwr,
后续上传照着这个不存在的目录建文件,只得到No such file。现在按终端单元格模型重放退格、删到
行尾、光标左右移动与 Tab 停位(宽字符按两列算),只把真正回车提交、且带提示符的行当成命令。
回归用例直接回放现场抓到的补全字节流。 - 脚本里的
rz不再"刚被拦下就被中止":以前一检测到 rz 握手就发 CAN + Ctrl-C,远端 rz 立刻退出,
脚本紧接着的[ ! -f dist.zip ]检查必然失败,上传完成后的动作全部错过。现在只有用户手敲的
rz(命令行有回显)才立即中止;脚本里的 rz(没有回显)先留着,ells 在后台选文件并完成 SFTP
上传,落盘之后才中止远端 rz,让脚本继续往下跑。取消选择、上传失败、远端目录解析失败也都会
放行,不会把脚本挂死。 - 上传目标目录不存在时,错误里直接写出是哪个目录:以前只会看到 SFTP 的
No such file,
分不清是本地文件还是远端目录的问题。现在先对目标目录做一次元数据检查,不存在/不是目录分别
给出明确提示。 - macOS 上 rz 弹出的文件框不再把访达一起锁死:对话框服务以前每次弹框前把 AppKit 策略切到
Regular、面板一关又切回 Prohibited,主线程随后一直停在 channel 的recv()上。面板关闭后
AppKit 还有 XPC 收尾事件要走主线程 run loop;主线程不转、策略又来回切,系统共享的
openAndSavePanelService会卡在旧客户端上,访达的打开/保存面板跟着转圈,直到 ells 退出才
恢复。现在首次弹框以 Accessory 正式拉起 AppKit(不进 Dock、不占菜单栏)并一直保持,不再
来回切策略;空闲时主线程按小步转 run loop,把面板的收尾事件跑完。
完整历史:CHANGELOG.md · 安全策略:SECURITY.md · 安装选项与卸载:README
ells v0.2.4
ells v0.2.4
一键安装 / Install
macOS / Linux:
ELLS_VERSION=v0.2.4 curl -fsSL https://raw.githubusercontent.com/lg10/ells/main/install.sh | shWindows PowerShell:
$env:ELLS_VERSION="v0.2.4"; irm https://raw.githubusercontent.com/lg10/ells/main/install.ps1 | iex安装脚本会强制校验 SHA256SUMS.txt。产物:ells-linux-x86_64 · ells-macos-universal(x86_64 + Apple Silicon 合一)· ells-windows-x86_64.exe · SHA256SUMS.txt
[0.2.4] - 2026-10-19
修复
- Windows 自更新重启不再"看起来像闪退":更新换完二进制后,新版本是在同一个控制台里被拉
起来的 —— 旧进程一退出,外层 shell 立刻把提示符打回同一块屏幕,于是两个进程往同一个控制台写。
取证过:新进程根本没死(备用屏进得去、事件流读得到、Resize也收到了,只是尺寸是继承来的
80×24),但用户看到的只是提示符压着一片残片,就像程序自己闪退了。现在 Windows 用
CREATE_NEW_CONSOLE拉起新版本 —— 它从第一帧起独占一块自己的控制台,在 Windows Terminal 下
就是新开一个标签;旧标签交还给 shell 之后还会打印一句"新版本在默认终端的新标签/新窗口里打开",
免得那条空白被当成崩溃。对照实验里新控制台拿到的是真实尺寸Resize(133, 30)与FocusGained。 - macOS / Linux 上 0.2.3 完全起不来(
Error: The cursor position could not be read within a normal duration)修好了:0.2.3 为了让第一帧整屏重画,用的是ratatui::Terminal::clear()。
这个函数第一步是"问终端光标现在在哪" —— unix 上那是一发\x1b[6n写进 stdout 然后等回话,
而 ells 在第一次绘制之前就把 crossterm 的异步事件流跑起来了,tty 的读字节归它管:回话被事件流
吃掉,问的人只能等到超时,clear()?一路冒泡到main,程序在第一帧之前就退出。Windows 上
"问光标"走控制台 API、不发转义序列,所以只有 macOS / Linux 全废。现在整屏重画改用
terminal.resize(当前尺寸):Viewport::Fullscreen下它做的是同一套"清屏 + 作废差分基线",
但不问光标。残影那个问题依旧没有回归 —— 守卫脚本在真 pty 里断言三件事:一个\x1b[6n都不许
发、列表页真的画出内容、按q退出码为 0 且离开备用屏。 - 更新换完二进制却没留下退路,现在有了:起不来就自动退回上一版:以前只有 Windows 会把旧镜像
挪成.old(因为它不许删运行中的 exe),unix 上旧的直接没了 —— 新版万一首帧就崩,用户手里既没有
旧版本、也看不到报错,只剩一行Error:。现在 unix 同样先挪备份,替换成功后写一条"待验证"记录
(ells.update.pending,就放在二进制旁边),第一帧真的画到屏幕上才算确认、把备份和记录一起扔掉。
两条退路:带着未确认的记录又起不来 → 下次启动当场退回上一版并自动重新拉起;主循环带着错误退出
→ 当场退回再拉起。退回过的版本记进ells.update.rejected,检查更新时不再把它当成新版本推给用户
(否则会卡在"提示更新 → 装上 → 崩 → 退回 → 又提示更新")。没有备份时绝不挪走正在跑的二进制。 - 启动时把同目录的启动名修回安装脚本的形状,
ells能开、s打不开不会再出现:安装脚本在同一
个目录里放下两个名字(Windows 上是ells.exe+s.exe两份真拷贝,macOS / Linux 上s是指向
ells的软链),而自更新只换得动"正在跑的那一个",替换中途还可能把软链变成一份独立拷贝、或让
它悬空指向一个已经不存在的名字(命令还在 PATH 里,执行只报"没有那个文件")。现在每次界面启动都
先按安装脚本的形状核对同目录:断链重新指回、缺失的名字补上、内容不同的用正在跑的这份覆盖;正在跑
的本身、以及解析后是同一个文件的软链一律跳过(拷回自己 = 边截断边读同一个 inode,会把刚装好的
二进制写坏),被别的实例占用、覆盖不动的也只是记一条日志然后跳过,不算启动失败。
完整历史:CHANGELOG.md · 安全策略:SECURITY.md · 安装选项与卸载:README
ells v0.2.3
ells v0.2.3
一键安装 / Install
macOS / Linux:
ELLS_VERSION=v0.2.3 curl -fsSL https://raw.githubusercontent.com/lg10/ells/main/install.sh | shWindows PowerShell:
$env:ELLS_VERSION="v0.2.3"; irm https://raw.githubusercontent.com/lg10/ells/main/install.ps1 | iex安装脚本会强制校验 SHA256SUMS.txt。产物:ells-linux-x86_64 · ells-macos-universal(x86_64 + Apple Silicon 合一)· ells-windows-x86_64.exe · SHA256SUMS.txt
[0.2.3] - 2026-10-11
修复
- 启动第一帧改成整屏重画,去掉更新重启后压在边距上的旧字:自更新换掉二进制再重启,回到主机
列表时左边距上留着几格红字残影(v0.2.1 的字压在 v0.2.2 没画的格子上)。根因不在更新,也不在
Windows Terminal,在我们自己:Terminal::new只造两张空缓冲就当"上一帧",随后第一帧走差分
绘制 —— 新画面留空的格子在差分里等于"没变",于是终端里本来就有的内容永远没人去擦。备用屏在
同一个标签页里退出再进入时交还的是上一份画面(更新重启、手动重跑都会撞上),所以那几格就留在
那儿了。现在启动时把repaint置位,让第一帧之前先真清一次屏并作废差分基线 —— 和"直通交回来 /
弹窗关掉"那几处用的是同一个机制。抓过启动字节流核对:改之前进入备用屏之后直接就是逐格写入
(全程没有ESC[2J),改之后ESC[2J ESC[1;1H落在设置标题之后、第一格绘制之前。 - 表单里"选私钥"那个系统文件框没登记"屏幕暂时归它":上传、下载、选目录三个原生对话框都会把
dialog_open立起来,主循环凭这个标志在对话框关掉后整屏重画一次;唯独私钥路径那个漏了登记,
所以关掉它之后屏幕上留什么就是什么。现在四个入口走同一条路(打开前立、回来时清,取消也要清
—— 不然标志卡在true,下一次整屏重画就永远等不到了)。 - 直通模式下不再能从别处把屏幕抢走:直通是"远端独占整块屏幕",那会儿 ells 一个字节都不画、
会话的原始字节直接裸写 stdout。但过去这些操作还能把画面切走:F2新建标签、F5/F6换标签、
鼠标点顶部标签条、Ctrl-S开文件浏览器、点顶部的下载按钮 —— 于是 ells 画它的、远端写它的,
两块画面叠在同一个屏幕上,差分基线也从此失真(表现就是一行行错位的字)。现在这些入口一律先让
远端把屏幕交回来:Ctrl-S按 F1/F3 的老规矩原样发给远端(直通期间 ells 不该吞远端的键),
标签操作和回列表则挡下并给一句"先按 Ctrl-Q 回内嵌",鼠标点击在直通期间直接不响应(那会儿命中
测试用的还是交出去之前那一帧的矩形)。Ctrl-]断开和Ctrl-Q切回内嵌不受影响 —— 直通期间
总得留下逃生门。
完整历史:CHANGELOG.md · 安全策略:SECURITY.md · 安装选项与卸载:README
ells v0.2.2
ells v0.2.2
一键安装 / Install
macOS / Linux:
ELLS_VERSION=v0.2.2 curl -fsSL https://raw.githubusercontent.com/lg10/ells/main/install.sh | shWindows PowerShell:
$env:ELLS_VERSION="v0.2.2"; irm https://raw.githubusercontent.com/lg10/ells/main/install.ps1 | iex安装脚本会强制校验 SHA256SUMS.txt。产物:ells-linux-x86_64 · ells-macos-universal(x86_64 + Apple Silicon 合一)· ells-windows-x86_64.exe · SHA256SUMS.txt
[0.2.2] - 2026-10-11
变更
- 启动页(主密码解锁/建库)整屏重排,并加了解锁进度条:以前那屏是"一个直角方框 + 一行
主密码:•••",忙的时候把整行文案换成"请稍候(约 1 秒)",输入框跟着消失,用户既看不出自己
按没按对,也没有任何"还在算"的凭据。现在按 抬头 — 输入 — 状态 — 键位 四段排:
圆角面板(BorderType::Rounded)顶栏居中写阶段名、底栏右端是版本与构建时刻;里面先是品牌抬头与
一句话说明,再断一条中间带点的细线。主密码放进自己的圆角输入盒(左上角标
「主密码」,右下角标回显状态),掩码后面画一格▏当光标。Tab切换明文回显(只改画法,
不改输入内容,也不落任何设置)。忙的时候输入盒留在原地,进度带在它正下方亮起来:条走的是
"已用时间 / 本进程实测的 argon2id 耗时"(第一次没有实测值就按 1 秒估),上限只到九成五
—— argon2 没有可上报进度的中间点,把最后那几格留给真结果,条就不会在算完之前假装到顶;
右边照实写"已用 X.X 秒",头三格▓▒░每帧轮换表示还在算。帧由一次性定时器驱动(80ms + 代号
作废,与会话页指标、自动重连同一套路),忙态一结束就没人再布防,全局依然没有常驻 tick。
建库那两步另有两处反馈:步骤指示(◉ 设置 · ○ 确认)与强度条(四格:≥8 位、≥14 位、
有数字、有符号 —— 不是安全分,是"够不够长够不够杂"的即时反馈)。键位行的按键写法改成芯片式
(键名加粗、动作淡一档),且列出的每个键都真能触发;错误行固定占一格,错误出现时下面的键位行
不再往下跳。终端被缩小时一律交给Layout压行,不会画到框外 —— 用TestBackend在 80×24、
70×20、40×12、30×8、20×5、12×3 六种尺寸整屏渲染验过。 - 启动页换上大号 ells 标识:抬头里那一行
e l l s换成五行高的块状点阵(ells,26 格宽,
居中后左右各余 12 格)。笔画只能是前景色的实心块█:这个主题系统里三套主题一处底色都不画,
换成▓/▒的深浅到别的终端主题上就分不开了。点阵整块居中而不是逐行居中 —— 逐行居中会按
每行自己的宽度挪,尾随空格一多四根笔画就互相错开。摆不摆由终端尺寸决定,且只有一个来源
(unlock_panel_size:解锁页要终端 20 行高、建库那两步要 24 行高才够放,宽度都要放得下整个面板
再加一格),不够就退回原来那行字标,绝不能让 logo 把错误行和键位行挤出框外。所以 20~23 行高的
终端上会看到"解锁页有大 logo、建库页退回字标"—— 两套画面的高度本来就差着建库的三行警示加一步
骤指示,这是各自判定的结果,不是抖动。
完整历史:CHANGELOG.md · 安全策略:SECURITY.md · 安装选项与卸载:README
ells v0.2.1
ells v0.2.1
一键安装 / Install
macOS / Linux:
ELLS_VERSION=v0.2.1 curl -fsSL https://raw.githubusercontent.com/lg10/ells/main/install.sh | shWindows PowerShell:
$env:ELLS_VERSION="v0.2.1"; irm https://raw.githubusercontent.com/lg10/ells/main/install.ps1 | iex安装脚本会强制校验 SHA256SUMS.txt。产物:ells-linux-x86_64 · ells-macos-universal(x86_64 + Apple Silicon 合一)· ells-windows-x86_64.exe · SHA256SUMS.txt
[0.2.1] - 2026-10-10
变更
- 默认主题在四个平台上都是「跟随终端」:以前 mac 默认跟随终端、Windows/Linux 默认深色(画死
黑底灰条),同一份代码两台机器长得不一样,而"画死底色"这套正是 Windows 那台出问题的原因。
深色那套留着给拿不准终端配色的人,设置页与 README 的说法同步改了。
修复
- 在跳板机上敲
exit也会被追问"要不要重连":会话收尾以前只认exit-status这一条证据,
而跳板机/网关这类服务端在logout之后直接把通道关掉(CHANNEL_EOF / CHANNEL_CLOSE),一个
退出状态都不发 —— 于是正常退出被判成掉线,轻则弹窗问重连、重则按退避自动重连回一台你刚离开的
机器(跟认证方式无关:出问题这两台都是密钥认证,一台记远端退出、另一台记连接断开;也跟
它是不是"跳板那一路"无关,ells 里两台都没配跳板)。现在收尾分四档:远端自己退了 / 对端正常关
通道 / 本地 Ctrl-] 断的,都算正常结束;只有通道凭空消失(TCP 死亡、keepalive 超时、服务端被杀)
和写不进去才算掉线,才走重连。假 sshd 因此多了两种服务器形状(logout只关通道、__drop__
直接拆 transport),冒烟测试把三档都跑了一遍。 - Windows 上会话页底部那行进度条被背景吃掉:条的"空"那一半一直是用
░网点画的,靠底色透出
来才看得见 —— 跟随终端时底色是终端的深底,透出来就是深色轨道(mac 上一直正常);而深色主题的
色带是浅灰,网点透出来还是浅灰,整根条和背景一个亮度,只剩一小截绿块孤零零在那儿。现在轨道
自己有一层底色(Palette::track:深色主题给黑,不画底色的三套一律Reset),条那一截从"只有
字形"变成"字形 + 自己的底",宽度数学、格数、mac 观感都不动。
完整历史:CHANGELOG.md · 安全策略:SECURITY.md · 安装选项与卸载:README
ells v0.2.0
ells v0.2.0
一键安装 / Install
macOS / Linux:
ELLS_VERSION=v0.2.0 curl -fsSL https://raw.githubusercontent.com/lg10/ells/main/install.sh | shWindows PowerShell:
$env:ELLS_VERSION="v0.2.0"; irm https://raw.githubusercontent.com/lg10/ells/main/install.ps1 | iex安装脚本会强制校验 SHA256SUMS.txt。产物:ells-linux-x86_64 · ells-macos-universal(x86_64 + Apple Silicon 合一)· ells-windows-x86_64.exe · SHA256SUMS.txt
[0.2.0] - 2026-10-10
安全
- 保存凭据不再原地覆写:
vault.bin、settings.ini、known_hosts、主密码副本
~/.ells/.master全部改为"同目录临时文件 → 写全 → fsync → rename"。原先的
create(true).truncate(true)在写一半时崩溃或断电会留下半截文件,而保险库损坏
等于主机与密码无法挽回(主密码不可能重建)。Unix 下临时文件同样收 0600。
新增
~/.ssh/config双向:导入现在认LocalForward/RemoteForward/
DynamicForward(含[bind:]port:host:hostport与 IPv6[::1]:6379这类带冒号的
目的端),通配段的转发按默认值下发;新增导出功能把保险库写成 ssh 配置片段,
导出里绝不出现密码(密码留在vault.bin)。- 端口转发内核:每台主机一条 SSH 连接承载它的全部规则,本地监听口在拨号之前
绑定并跨重连持有(掉线期间端口不被抢走,来连的请求排在 backlog 里等),失败按
[1,2,5,15,30,60]秒退避并封顶。-L与-D(SOCKS5,无认证)已实现;-R的规则
可以存库与往返导入,但会明确报告"暂不支持"而不是假装工作。 - 无头 CLI:
ells list(--format table|json、--filter)、ells exec <别名> -- <命令>
(--tty/--timeout/--stdin,远端退出码原样透传)、ells sftp ls|get|put|rm|chmod、
ells tunnel <别名>|--all(只起转发并常驻)、ells export [--out]、ells completions bash|zsh|fish。退出码是对外契约:0成功 ·1失败 ·2用法或安全闸门(差一个
--yes、删目录没给--recursive,原因用中文打到 stderr)·124超时。主密码经
ELLS_MASTER或 stdin 第一行传入,任何密码、私钥内容、主密码都不会被打印,
--format json里只有可公开的元数据;-y只放行首次密钥,密钥变更照样拒绝。 - 隧道管理器界面:列表页
t打开,每台一行▲已就绪 /◐连或重连中 /▼失败,
空格/s就地启停、Enter进规则表格改规则,x全停;隧道不随会话标签关闭而死,状态变化写进操作记录。 - 主机组织:表单新增「分组」「标签」「转发」三栏,默认列表排序为 分组 → 组内收藏 →
组内最近使用 → 别名(o可换档);f加星置顶,/之后直接打字做模糊过滤(别名、主机、用户、
分组、标签、备注都算命中,#标签精确命中)。 - 操作记录:连接 / 断开 / 连接失败、主机密钥被信任或变更、每一次传输、隧道状态、
保险库保存、导入导出、改主密码都追加进~/.ells/audit.log(北京时间、只追加、
超 1 MiB 保后半转存)。记录写入前抹掉控制字符与换行,防止远端字符串往日志里塞假记录。
列表页l直接翻看,不用出界面。 - 会话落盘:每建立一路会话把终端原始字节另存
~/.ells/logs/<别名>-<时间>.log
(保留 ANSI,事后less -R照样带色),单份 8 MiB 封顶、启动时清理 30 天前的旧件;
列表页v打开面板看列表(Enter进正文,控制序列已剥掉,d删单份),开关在
「设置 → 会话记录」。 - 已知主机密钥面板:
h列出~/.ells/known_hosts(ells 自己记的,d可删,删掉
下次连重新问指纹)与~/.ssh/known_hosts(只显示,永不改动)。 - 断线自动重连:非人为断开按指数退避自己接回去——
initial * 2^(n-1)、封顶
max_delay_ms、只往上加的抖动(不引入rand,用纳秒与 pid 混出的伪随机量);
连着超过reconnect_stable_secs才算"稳了",下次掉线重头计次。排队时状态行写明
"N 秒后自动重连(第 n/m 次)· 按 Ctrl-] 停止",每一路带代号,用户自己断开、关标签
或手动重连后旧定时器立即作废。主机密钥被拒不是网络问题,永不自动重试。次数上限在
「设置 → 自动重连」按Enter在关 → 1 → 2 → 3 → 5 → 无限间循环,←→微调。 - 远端
chmod:浏览器c与ells sftp chmod <别名> 600 /path共用一份八进制解析
(644/0644/0o644/0/0000都合法,7778、abc、空串给中文报错),
只送权限位——属主、大小、时间戳一概不动。 - 列表页
x导出 ssh_config:落点固定~/.ells/ssh_config.export(原子写),确认框里
先说清写几台、写到哪、不含密码;~/.ssh/config本体任何路径下都不写。 a新增带模板:列表里选中一台时按a,把它的用户 / 端口 / 认证方式 / 私钥路径 /
跳板 / 分组 / 标签 / 转发带进新表,但别名、主机名和密码 / 私钥口令一律留空——
结构可以复用,身份和凭据必须自己填(这条有单测兜着)。- 列表页按分组分段:每个分组一个段头
▾ 生产 (3),Space折叠/展开光标所在那一段,
z一键收起全部或全部放出(全折叠时列表只剩段头,正好数清自己有几组)。折叠只在真的
按分组排的时候生效:一进过滤就收起段头、折叠一并失效,免得"明明搜到了却看不见"。
段头的计数连被折起来的那些一起算,展开前后数字不变。 o循环排序四档:默认(分组 → 组内收藏 → 组内最近使用 → 别名)· 最近使用 · 别名 ·
分组(组内只按别名)。选中的那档写进settings.ini的list_sort=,下次启动还是它。- 每行右端一列「最近使用」:
刚刚 / 5分 / 3小时 / 昨天 / 5天 / 2月 / 从未,相对时间按
字符对齐在行尾。哪台还在手上过,不用再点进去猜。 - 过滤命中可视化:面板标题写
命中 n/m,别名里被命中的那几个字符点亮(按下标切段,
汉字不会被切成半截)。 - 表单必填标记:别名 / 主机 / 用户三项前面打
*,提交失败时只点缺的那几项的名,
不再一句"别名、主机、用户是必填项"把已经填对的也重报一遍。 Ctrl-R让口令显形:光标在「密码」或「私钥口令」上按一次就明文显示,再按遮回去。
十次"存完连不上"有八次是密码末尾多敲了一个字符,之前只能反复重填。- 「分组」栏行内提示:光标停在这一栏时,下面列出已有分组及各自台数,并说清这次是
「归入生产」还是「将新建 xxx」——「生产」「生产 」这种只差空格的写法从此合并成同一段。 - 端口转发规则表格编辑器:隧道面板里按
Enter(列表页按p)进表格,一行一条规则、
五列对着填——类型 / 绑定 / 本地端口 / 目标主机 / 目标端口。↑↓移行、←→/Tab移格
(第 1 列上←→循环L/D/R)、Ctrl-N加行、Ctrl-D删行、Ctrl-C清空当前格、
Enter保存、Esc放弃。逐行报错并带表里的行号,只点缺的那一格的名;隧道正在跑就按
新规则自动重启,规则清空则顺手停掉。 - 本地端口可以留空 = 交给系统分配(与
ssh -L 0:db:5432同义):两台 SSH 链接都想占物理机
8080 时,其中一台留空就不互挤。表单的「转发」栏也能只写目标(-L db:5432)。存盘仍是
listen_port: 0,保险库格式与ssh_config往返都不变。 - 「端口映射」总表(
m,或点隧道面板顶部那个按钮):主机 / 规则 / 实际监听 / 状态四列,
自动分配最后落在哪个口只在这里看得见(标「(自动)」)。隧道每次状态变化都带上自己
实际绑上的地址端口,停止即从总表消失,不会留一个已经不存在的口。 - 撞口不再靠猜:编辑时同一口的行尾标
⚠并在表下点名"与 db-prod、本表第 2 行 同用 8080 —
留空本地口即可自动分配";隧道面板顶部直接写⚠ 8080 被多台主机共用;真去绑定时失败原因
说清是谁占着(另一台 ells 主机的哪条规则),没有别人占就明说是外部程序。写死的端口绝不偷偷
换号——只提示、只报因。 ells tunnel每行状态都带着实际绑上的本地端口,它同时就是"这条 db 到底开在哪个口"的查询命令。- 会话页底部一行远端主机指标:CPU / 内存 / 磁盘三根进度条带整数百分比,磁盘取用得最满的那个
真实挂载点,比例直接照抄df的 Capacity 列(自己算会和df差几个点,用户一对照就认为 ells
在编数字),旁边补一句挂载点和已用/总量;1/5/15 分钟平均负载同排(摆得下才写 ——
占用和排队是两件事,8 核机器上 CPU 50% 很闲、负载 24 已经在挤)。这两句补充的话一律排在整行末尾,
三格本身只有标签、进度条和百分比:挂在各自那一格后面会把那一格撑得比旁边的宽,用户第一眼
看到的是"这根条怎么长一点"而不是数变了没有。数据走的是那条已经认证好的
连接:优先在它已有的 SFTP 会话上读/proc/stat、/proc/meminfo、/proc/loadavg、/proc/mounts,
磁盘用statvfs@openssh.com问本地盘(网络盘一律不问 —— 一次卡在失效挂载点上的 statvfs 会把整条
SFTP 会话拖住,文件传输跟着停);没有 SFTP、服务器不支持那个扩展或读不到东西时,回落一条一次性
exec只读通道(df -Pk),且只填还空着的那几格(CPU 靠两次快照做差,混进另一个来源的基线就成了
一条没意义的斜线)。不重做 TCP + 握手 + 认证、不碰用户正在敲的那个 PTY、远端不留进程。默认开,
节奏是分频的:/proc那三样 5 秒一轮,磁盘那一格也 5 秒一换,但中间那些轮只对「上次普查里最满
那块」问一次statvfs(挂载点表缓存在这条连接上,一个往返),普查(重读/proc/mounts、逐块问、
重新决定谁最满)60 秒才走一次 —— 逐块问盘是代价最大的一条腿,而挂载点集合一分钟里几乎不动。
没有statvfs@openssh.com的服务器上,跟单轮一个请求都不发、那一格沿用上次的数,df只在 60 秒的
普查点兜底 —— 否则那一格会把 60 秒的节奏悄悄退化成每 5 秒 fork 一个 shell(缓存的价值正在这一条)。
连上的第一轮就是普查,不必等一分钟。没在看的标签降到 60 秒一轮 —— 八个标签
一起开着时每台服务器看到的是"一分钟一次",而不是"每五秒八次";切回它那一格当场重采一轮。首帧不等:
SFTP 子系统本来就在connect()里先于 PTY 开好,所以连上立刻跑第一轮,内存、磁盘、负载当场有数;
CPU 必须两次快照做差才是瞬时值,拿到基线的那一轮之后单独用两秒接力,进去约两秒见第一个数(没有
/proc/stat的机器永远不会cpu_pending,不会两秒一次空转),之后回到 5 秒一轮;FreeBSD、精简容器
那一格一直是—而磁盘照常。采不到一律画
—,绝不折成0%;连续三轮什么都拿不到就判定这台不支持,停掉轮询、把这一行还给终端。两类失败
分开对待:通道级失败(超时、开不了通道、执行报错)说的是"这会儿采不到",不判死,只把节奏退到
5 → 10 → 30 → 60 秒,退到顶端时状态行说一句,任意一轮拿到数就自动回到 5 秒。开关在
「设置 → 主机指标」(metrics=),关掉或打开都对已经连上的标签当场生效。底部行数由 App 一处
决定,绘制、鼠标命中与视口/PTY 尺寸同源,不会出现"画面被裁掉一行"。
变更
ells --help补齐子命令清单、退出码约定与新增的~/.ells文件;快捷键一览加上
xthlv。- 设置面板新增「会话记录」与「自动重连」两行,鼠标命中区与绘制几何同步(有单测对齐)。
- 审计新增
export事件类型;ells export的写盘同样改为原子写并记一条审计。 - 隧道面板的启停从
Enter挪到空格/s:Enter在全程序都是"进入/确认",这里过去却是
"启停",改成Enter进规则表格改规则。全程序的Enter从此只做进入/确认一件事(列表页连接、
弹窗确认、表格保存),不再在一个面板里既是开关又是编辑;面板底部键位行与帮助页同步。 - 默认排序把「分组」提到「收藏」前面(收藏仍在组内置顶、星号仍在)。段头必须每组只出现
一次,全局收藏优先会让同一组被拆成两段。保险库文件格式不动,老库直接兼容。 - 启动就看到的信息更多:品牌行写
ells 主机列表 · n 台 · k 组 · 版本,面板标题写
共 n · 排序 X · 在线 k;空库提示补上"或按 i 从 ~/.ssh/config 导入"。 - 键位行与帮助页同步了
Space/z/o与表单里的Ctrl-R、*,以及新的p规则表格、
m端口映射。
文档纠偏
- ssh-agent / Pageant 认证早已落地,从路线图移入功能清单;keepalive 可调范围按代码
实际(5–3600 秒)修正,此前写的是 15–300 秒。
修复
- 隧道面板的空格键真的能启停了:面板底部和帮助页都写着"Enter/空格 启停",代码里却只绑了
s——照文案按空格什么都不会发生。现在空格与s都启停(s留着,老习惯不断)。 #标签过滤不再永远空结果:表单和文档都说"过滤时按#标签命中",可过滤串里的井号
被当成普通查询字符,而索引里存的是裸标签名,于是带井号打头必然一个都命不中。现在剥掉
查询串开头的#(ells list --filter同一份逻辑)。- Windows 安装脚本不再把 ARM64 / 老 .NET 误判成"不支持的架构":
install.ps1原先只认
OSArchitecture = X64,Windows on ARM 装不上(其实 x86_64 产物由系统内置转译运行),
老 .NET Framework 下取值为空也会误报。现在取不到就回落PROCESSOR_ARCHITECTURE,
x86_64 直装、ARM64 装 x86_64 并提示走转译,仅 32 位或未知架构才报错。 - 规则表格里"按了
Ctrl-N还没填"的那一行不再拦保存:它的类型格默认就是L,旧判定把整行
当成"填了一半",于是新增一行反倒报"第 n 行:目标主机、目标端口不能空着"——用户根本没写过这行。 - 表格滚动后鼠标点的是看得见的哪一行:绘制按滚动窗口重排了行位置,命中测试还在用未滚动的
行号,滚两行再点第 3 行会把光标放到第 1 行上。几何与滚动窗口现在只算一次、画和点共用一份。 - 表格最后一格按
→不再把焦点推出列外(推出后高亮画不出来,打字像丢了)。 - 隧道面板顶部的「端口映射」按钮在极窄终端上不再伸出面板边框。
- 从隧道面板按
m打开的弹窗,Esc关的是弹窗不是面板:两个标记同时为真时按键先给了背后
那个面板,弹窗会留在屏幕上关不掉。叠着开的界面现在统一从最上层开始吃键(与绘制顺序一致)。 ells tunnel的"启动 …"一行改用可读写法:自动口显示-L 自动 → db:5432,不再是像填错的
-L 0:db:5432;-R的"暂不支持"报错同理。- 从已知主机密钥 / 操作记录跳回列表时会先展开目标所在分组:否则光标只会被夹到别的主机
上,看起来像"点错了机器"。 - 帮助页原先写的排序规则(收藏 → 分组 → 最近使用 → 别名)与代码不符,已按实际四种排序重写。
- 弹窗、原生文件框、直通模式关闭后不再留残影:Windows 10 上(cmd 与 Windows Terminal 都中)
关掉"连接已断开"这类弹窗后,屏幕上会留着几处文字,样式还不是原来那套。根子是 ratatui 只补
差分:它以为屏幕还是上一帧,而那片刻屏幕已经被远端(直通模式直接往 stdout 写字)或被盖上来的
窗口占过,Win10 的控制台又会把被切断的全角字留下半格残片 —— 于是"没有变化"的那些格子永远没人
重写。现在主循环盯住三次"屏幕换主":从直通切回来、原生文件框关闭、最后一层弹窗关闭,任一次都
先整屏清一遍再画(清屏同时作废差分基线,这一帧是真正的全量第一帧)。顺带Ctrl-L整屏重绘
过去只复位内嵌终端的屏幕缓冲,压根没动界面,是一句空头承诺;现在它真的整屏重画。
完整历史:CHANGELOG.md · 安全策略:SECURITY.md · 安装选项与卸载:README
ells v0.1.9
ells v0.1.9
一键安装 / Install
macOS / Linux:
ELLS_VERSION=v0.1.9 curl -fsSL https://raw.githubusercontent.com/lg10/ells/main/install.sh | shWindows PowerShell:
$env:ELLS_VERSION="v0.1.9"; irm https://raw.githubusercontent.com/lg10/ells/main/install.ps1 | iex安装脚本会强制校验 SHA256SUMS.txt。产物:ells-linux-x86_64 · ells-macos-universal(x86_64 + Apple Silicon 合一)· ells-windows-x86_64.exe · SHA256SUMS.txt
[0.1.9] - 2026-10-09
修复
- macOS:更新后选"立刻重启"不再报
Input/output error (os error 5):旧实现从工作线程
spawn新进程再exit(0),新版本继承的是旧进程组的进程组——旧进程一退出它就不再是
终端的前台进程组,macOS 上任何 termios 初始化直接返回 EIO,还没开局就死。
现在 unix 上改用exec原地替换进程映像(pid、进程组、控制终端全部保留),
并把拉起动作挪回主线程执行;Windows 无此语义,维持 spawn。
完整历史:CHANGELOG.md · 安全策略:SECURITY.md · 安装选项与卸载:README