Skip to content

Releases: lg10/ells

ells v0.2.8

Choose a tag to compare

@github-actions github-actions released this 04 Nov 14:29

ells v0.2.8

一键安装 / Install

macOS / Linux:

ELLS_VERSION=v0.2.8 curl -fsSL https://raw.githubusercontent.com/lg10/ells/main/install.sh | sh

Windows 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 通道建不起来时才回落 docker CLI,
    避免重启/停止被执行两次。端口中心那页回车也作用于映射所属的容器。
  • 容器详情弹窗:inspect 的名称、镜像、状态与健康、创建/启动时间、运行时长、重启策略、
    退出码,配上一次性的 CPU / 内存 / 网络 / 进程 / 磁盘 I/O,以及网络、端口、挂载、命令,
    分区排版在同一个弹窗里;内容超屏可滚动,c 复制整份详情。

完整历史:CHANGELOG.md · 安全策略:SECURITY.md · 安装选项与卸载:README

ells v0.2.7

Choose a tag to compare

@github-actions github-actions released this 04 Nov 12:55

ells v0.2.7

一键安装 / Install

macOS / Linux:

ELLS_VERSION=v0.2.7 curl -fsSL https://raw.githubusercontent.com/lg10/ells/main/install.sh | sh

Windows 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

Choose a tag to compare

@github-actions github-actions released this 04 Nov 10:15

ells v0.2.6

一键安装 / Install

macOS / Linux:

ELLS_VERSION=v0.2.6 curl -fsSL https://raw.githubusercontent.com/lg10/ells/main/install.sh | sh

Windows 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

Choose a tag to compare

@github-actions github-actions released this 21 Oct 03:15

ells v0.2.5

一键安装 / Install

macOS / Linux:

ELLS_VERSION=v0.2.5 curl -fsSL https://raw.githubusercontent.com/lg10/ells/main/install.sh | sh

Windows 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

Choose a tag to compare

@github-actions github-actions released this 19 Oct 11:06

ells v0.2.4

一键安装 / Install

macOS / Linux:

ELLS_VERSION=v0.2.4 curl -fsSL https://raw.githubusercontent.com/lg10/ells/main/install.sh | sh

Windows 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

Choose a tag to compare

@github-actions github-actions released this 11 Oct 16:09

ells v0.2.3

一键安装 / Install

macOS / Linux:

ELLS_VERSION=v0.2.3 curl -fsSL https://raw.githubusercontent.com/lg10/ells/main/install.sh | sh

Windows 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

Choose a tag to compare

@github-actions github-actions released this 11 Oct 04:52

ells v0.2.2

一键安装 / Install

macOS / Linux:

ELLS_VERSION=v0.2.2 curl -fsSL https://raw.githubusercontent.com/lg10/ells/main/install.sh | sh

Windows 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

Choose a tag to compare

@github-actions github-actions released this 10 Oct 06:39

ells v0.2.1

一键安装 / Install

macOS / Linux:

ELLS_VERSION=v0.2.1 curl -fsSL https://raw.githubusercontent.com/lg10/ells/main/install.sh | sh

Windows 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

Choose a tag to compare

@github-actions github-actions released this 10 Oct 05:23

ells v0.2.0

一键安装 / Install

macOS / Linux:

ELLS_VERSION=v0.2.0 curl -fsSL https://raw.githubusercontent.com/lg10/ells/main/install.sh | sh

Windows 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 文件;快捷键一览加上
    x t h l v。
  • 设置面板新增「会话记录」与「自动重连」两行,鼠标命中区与绘制几何同步(有单测对齐)。
  • 审计新增 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

Choose a tag to compare

@github-actions github-actions released this 09 Oct 03:59

ells v0.1.9

一键安装 / Install

macOS / Linux:

ELLS_VERSION=v0.1.9 curl -fsSL https://raw.githubusercontent.com/lg10/ells/main/install.sh | sh

Windows 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