Пользователь hardened Gentoo редко запускает ssh-askpass — почти везде он обходится ключами -sk для ED25519. Но иногда программа запрашивает парольную фразу для обычного ключа без доступа к терминалу, например go get при сборке приватных модулей. В таких случаях OpenSSH вызывает всё, на что указывает переменная SSH_ASKPASS, а в системе ничего не стояло. Главная причина — всё, что предлагает Portage, тянет за собой X11 или гору ненужных пакетов.
В репозитории пять кандидатов. kde-plasma/ksshaskpass — единственный без явной привязки к X, но установка требует 22 пакета KDE Frameworks и KWallet, а пользователь сидит на Sway и тащить полстека KDE не хочет. lxqt-base/lxqt-openssh-askpass просит X и пересобирает dev-qt/qtbase с X-поддержкой, что вызывает конфликт слотов с уже собранным -X вариантом. net-misc/ssh-askpass-fullscreen тянет GTK2 и cairo с X. net-misc/x11-ssh-askpass завязан на X11 по названию и для сборки требует древний imake. net-misc/gnome-ssh-askpass внешне выглядит свободным от X, но внутри использует заголовок gdk/gdkx.h и падает на системе без X11.
Тогда автор написал свой ssh-askpass на Zig 0.16 и GTK4, назвал ssh-askpass-zigtk. Чтобы избежать включения X-заголовков, он не пользуется @cImport, а вручную описывает три десятка функций GTK и GLib как extern-прототипы. Все виджеты — один opaque тип *Widget, потому что GObject на уровне ABI совместим с GtkWidget*. Код клавиши Escape жёстко задан как 0xff1b, без инклуда gdk/gdkkeysyms.h. Парсинг переменных вроде SSH_ASKPASS_PROMPT и GNOME_SSH_ASKPASS_*_COLOR живёт отдельно в src/root.zig с юнит-тестами, которые запускаются без дисплея. Смена цветов идёт через CSS-провайдер — в GTK4 убрали gtk_widget_modify_fg.
Благодаря ручным объявлениям Zig может кросс-компилировать бинарник под восемь архитектур (x86_64, aarch64, armv7, riscv64, powerpc64le, i386, loongarch64, s390x) с одной машины. Для линковки подставляется stub-библиотека libgtk-4.so.1 (флаг -Dgtk-stub), а настоящая GTK4 подхватывается на целевой системе. Программа не захватывает клавиатуру — в Wayland это невозможно, поэтому переменные GNOME_SSH_ASKPASS_GRAB_SERVER и GRAB_POINTER игнорируются.
Код размещён на tty.fail и зеркалирован на GitHub, релизы включают готовые исполняемые файлы под все архитектуры. Чтобы включить, нужно положить бинарник в PATH и прописать две переменные: SSH_ASKPASS с путём к нему и SSH_ASKPASS_REQUIRE=prefer (работает с OpenSSH 8.4). В сессии systemd те же настройки кладутся в ~/.config/environment.d/ssh-askpass.conf как KEY=VALUE с абсолютным путём. После перезахода в сессию ssh-add, git pull или go get без терминала выводят графический диалог.