Gentoo 下用 Zig 和 GTK4 手写 ssh-askpass

A GTK4 SSH-askpass in Zig

Gentoo 下用 Zig 和 GTK4 手写 ssh-askpass

在 Gentoo 系统中,现有的 ssh-askpass 实现要么依赖 X11,要么会拉入庞大的 KDE 栈,这与我坚持的无 X11 和 Sway 桌面环境格格不入。面对 Portage 中那些因依赖冲突或构建失败而无法使用的选项,我决定自己动手。利用 Zig 0.16 和 GTK4,我编写了一个自定义的 ssh-askpass 工具,通过手写绑定彻底避开了 X11 依赖。这不仅解决了在 go get 等无 TTY 场景下输入 SSH 密钥密码的痛点,更是一次对极简主义和系统纯净度的坚持,证明了在特定约束下,手写代码往往比依赖现有生态更优雅。

Gentoo 仓库里的每个 ssh-askpass 实现都会拉入 X11 或完整的 KDE 栈,所以我用 Zig 0.16 和 GTK4 自己写了一个,通过手写绑定让构建过程完全避开 X。
  1. danudey

    注意到在构建这个项目时,它最终会直接链接到至少六个实际上并未使用的库(至少在 Ubuntu 上是这样)。我是通过用以下命令替换原有的链接指令来修复的:

    exe_mod.linkSystemLibrary("gtk-4", .{ .use_pkg_config = .no });

    exe_mod.linkSystemLibrary("gobject-2.0", .{});

    至少在我的情况下,这并没有改变完整的库树结构,因为 gtk-4 仍然链接着所有被从该二进制文件列表中移除的库,但这意味着像 dpkg-shlibdeps 这样计算依赖关系的程序,在分析二进制文件时就不会再报告虚假的“必需”依赖项了。

    在 Ubuntu 26.04 上构建时,该二进制文件不再直接链接 lib{pango, cairo, pangocairo, cairo-gobject, harfbuzz, gdk_pixbuf, graphene, gio, vulkan}。

    我没法在这个网站上注册账号,所以决定在这里发帖。如果你追求绝对的极简主义,对于在更“过度”的 GTK 构建环境(例如 Ubuntu 的)下进行构建的人来说,这似乎是朝着正确方向迈出的另一步。

  2. DannyBee

    每当有人写下“带有手写绑定”时,我读到的意思就是“下个版本发布后 8 分钟就会失效”。

  3. gen2brain

    不错,我目前用的是 lxqt-openssh-askpass,不过我是在 X11 环境下。一个更轻量级的替代方案(针对单行文本输入)是 FLTK。1.4 版本非常棒,支持 Wayland,甚至能在 GNOME 上绘制自定义的窗口装饰。Cairo 和 FLTK 应该都能用 -X 编译,不过我不太确定 Zig 绑定的现状如何。

同日更多故事

2026-07-31