プログラミング
ZigでGTK4 SSH-askpassを実装
A GTK4 SSH-askpass in Zig (xn--gckvb8fzb.com)
要約
Gentoo Linuxユーザーが、依存関係が重い既存のSSHパスフレーズ入力ツールに不満を持ち、Zig言語とGTK4を用いて軽量な代替ツールを自作した。このツールはX11に依存せず、Goのプライベートモジュール取得時など、ターミナルがない環境でのSSH認証に役立つ。
全文翻訳
GentooツリーにあるSSH-askpassは、X11または完全なKDEスタックを必要とするため、私はZig 0.16とGTK4、そしてビルドからXを排除する手書きバインディングで独自のものを書きました。
私はラップトップでハード化されたGentooを実行しており、ほとんどのシステムで-skキーを使用しているため、SSH-askpassに触れることはほとんどありません。ただし、プログラムが通常のED25519キーのSSHキーパスフレーズを必要とするが、それを読み取るためのターミナルがないという状況が1種類あります。一般的なケースは、ビルド中にSSH経由でプライベートモジュールを取得するgo get、または一般的なgoツールチェーンで、TTYなしで実行されるビルド中に発生します。OpenSSHはパイプでプロンプトを表示できないため、SSH_ASKPASSが指すものを実行し、パスフレーズプロンプトをウィンドウに表示します。長年、私はそのためのものを何もインストールしておらず、これらのシナリオを回避しなければなりませんでした。その主な理由は、GentooのPortageが提供するものです:
~ emerge -s ssh-askpass [ 結果 : ssh-askpass ] 検索中... * kde-plasma/ksshaskpass 利用可能な最新バージョン: 6.6.6 インストール済みの最新バージョン: [ インストールされていません ] ファイルサイズ: 32 KiB ホームページ: https://kde.org/plasma-desktop https://invent.kde.org/plasma/ksshaskpass 説明: KDE Wallet統合付きssh-askpassの実装 ライセンス: GPL-2 * lxqt-base/lxqt-openssh-askpass 利用可能な最新バージョン: 2.4.0 インストール済みの最新バージョン: [ インストールされていません ] ファイルサイズ: 19 KiB ホームページ: https://lxqt-project.org/ https://github.com/lxqt/lxqt-openssh-askpass/ 説明: LXQt OpenSSHユーザーパスワードプロンプトツール ライセンス: LGPL-2.1 LGPL-2.1+ * net-misc/gnome-ssh-askpass 利用可能な最新バージョン: 10.0_p1 インストール済みの最新バージョン: [ インストールされていません ] ファイルサイズ: 1,927 KiB ホームページ: https://www.openssh.com/ 説明: OpenSSHで使用するためのGTKベースのパスフレーズダイアログ ライセンス: BSD GPL-2 * net-misc/ssh-askpass-fullscreen 利用可能な最新バージョン: 1.2 インストール済みの最新バージョン: [ インストールされていません ] ファイルサイズ: 81 KiB ホームページ: https://github.com/atj/ssh-askpass-fullscreen 説明: GTK2で書かれた小さなSSH Askpass代替ライセンス: GPL-2+ * net-misc/x11-ssh-askpass 利用可能な最新バージョン: 1.2.4.1-r2 インストール済みの最新バージョン: [ インストールされていません ] ファイルサイズ: 30 KiB ホームページ: https://github.com/sigmavirus24/x11-ssh-askpass 説明: OpenSSHで使用するためのX11ベースのパスフレーズダイアログ ライセンス: HPND [ 見つかったアプリケーション : 5 ]
これらすべてに、私が我慢したくない不便が少なくとも1つありました。私のシステムはグローバルな-X USEフラグで実行されているため、X11を必要とするものはすべて、さらに調べる前に除外されます。5つのうち、kde-plasma/ksshaskpassはX11依存関係がまったくない唯一のものであり、それが明白な選択肢であるべきでしたが、問題はそれに付随する他のすべてです。Swayユーザーとして、私は時折パスフレーズを入力するためだけにマシンに完全なKDEスタックを導入したくありませんでした。それがksshaskpassのインストールが引き起こすものです:~ # emerge -a kde-plasma/ksshaskpass これらはマージされるパッケージです、順序は次のとおりです:依存関係を計算中...完了!依存関係解決に1.18秒かかりました(バックトラック:0/20)。[ebuild N ] kde-frameworks/kf-env-6 [ebuild N ] dev-libs/plasma-wayland-protocols-1.21.0 USE="-test" [ebuild N ] dev-libs/qtkeychain-0.16.0 USE="-keyring -test" [ebuild N ] kde-frameworks/ksecretd-services-6.27.0 USE="(-systemd)" [ebuild N ] kde-frameworks/breeze-icons-6.27.0 USE="-test" [ebuild N ] kde-frameworks/ki18n-6.27.0 USE="-debug -test" PYTHON_SINGLE_TARGET="python3_14 -python3_12 -python3_13" [ebuild N ] kde-frameworks/kconfig-6.27.0 USE="dbus -debug -qml -test" [ebuild N ] kde-frameworks/kcoreaddons-6.27.0 USE="dbus -debug -test" [ebuild N ] kde-frameworks/kwidgetsaddons-6.27.0 USE="-debug -designer -test" [ebuild N ] kde-frameworks/kdbusaddons-6.27.0 USE="-X -debug -test" [ebuild N ] kde-frameworks/kwindowsystem-6.27.0 USE="wayland -X -debug -test" [ebuild N ] app-crypt/qca-2.3.10-r1 USE="ssl -botan -debug -doc -examples -gcrypt -gpg -logger -nss -pkcs11 -sasl -softstore -test" [ebuild N ] kde-frameworks/karchive-6.27.0 USE="crypt zstd -debug -test" [ebuild N ] kde-frameworks/kguiaddons-6.27.0 USE="dbus wayland -X -debug -test" [ebuild N ] kde-frameworks/kdoctools-6.27.0 USE="nls -debug -test" [ebuild N ] kde-frameworks/kcolorscheme-6.27.0 USE="-debug" [ebuild N ] kde-frameworks/kcrash-6.27.0 USE="-X -debug -test" [ebuild N ] kde-frameworks/knotifications-6.27.0 USE="-debug" [ebuild N ] kde-frameworks/kservice-6.27.0 USE="man -debug -test" [ebuild N ] kde-frameworks/kwallet-6.27.0 USE="-debug -minimal -test" [ebuild N ] kde-frameworks/kwallet-runtime-6.27.0 USE="(keyring) (legacy-kwallet) man -X -debug -gpg -test" [ebuild N ] kde-plasma/ksshaskpass-6.6.6 USE="-debug" これらのパッケージをマージしますか? [はい/いいえ] lxqt-base/lxqt-openssh-askpassが次に来て、直接Xを必要とします。さらに、それはいくつかのKDEフレームワークパッケージとXサポートでビルドされたQtを引き込みます。これは、私のシステムに既に存在する-Xでコンパイルされたdev-qt/qtbaseと競合するため、Portageはスロット競合で停止します:~ # emerge -a lxqt-base/lxqt-openssh-askpass これらはマージされるパッケージです、順序は次のとおりです:依存関係を計算中...完了!依存関係解決に3.10秒かかりました(バックトラック:0/20)。[ebuild R ] x11-libs/libxkbcommon-1.13.2 USE="X*" [ebuild N ] dev-util/lxqt-build-tools-2.4.0 [ebuild N ] x11-libs/xcb-util-renderutil-0.3.10 ABI_X86="(64) -32 (-x32)" [ebuild N ] x11-libs/libXScrnSaver-1.2.5 USE="-doc" ABI_X86="(64) -32 (-x32)" [ebuild N ] dev-libs/plasma-wayland-protocols-1.21.0 USE="-test" [ebuild N ] x11-libs/xcb-util-wm-0.4.2 ABI_X86="(64) -32 (-x32)" [ebuild N ] x11-libs/xcb-util-0.4.1 ABI_X86="(64) -32 (-x32)" [ebuild N ] x11-libs/xcb-util-image-0.4.1 ABI_X86="(64) -32 (-x32)" [ebuild N ] x11-libs/xcb-util-cursor-0.1.6 ABI_X86="(64) -32 (-x32)" [ebuild R ] dev-qt/qtbase-6.11.1 USE="X*" [ebuild N ] sys-auth/polkit-qt-0.201.1 [ebuild N ] dev-libs/libqtxdg-4.4.0 USE="-test" [ebuild N ] kde-frameworks/kf-env-6 [ebuild N ] kde-frameworks/kwindowsystem-6.27.0 USE="X wayland -debug -test" [ebuild N ] lxqt-base/liblxqt-2.4.0 USE="backlight" [ebuild N ] lxqt-base/lxqt-openssh-askpass-2.4.0 !!! 単一パッケージスロット内に複数のパッケージインスタンスが依存関係グラフに引き込まれ、スロット競合が発生しました:dev-qt/qtbase:6 (dev-qt/qtbase-6.11.1:6/6.11.1::gentoo, インストール済み) USE="concurrent dbus gui icu libinput libproxy network nls opengl sql sqlite ssl syslog udev vulkan wayland widgets xml (zstd) -X -accessibility -brotli -cups -custom-cflags -eglfs -evdev -gles2-only -gssapi -gtk -io-uring (-journald) -mysql -oci8 -odbc -postgres -renderdoc -sctp -test -tslib" ABI_X86="(64)" ~dev-qt/qtbase-6.11.1:6[X=,concurrent,eglfs=] によって引き込まれました (dev-qt/qtbase-6.11.1:6/6.11.1::gentoo, マージ予定) USE="X concurrent dbus gui icu libinput libproxy network nls opengl sql sqlite ssl syslog udev vulkan wayland widgets xml (zstd) -accessibility -brotli -cups -custom-cflags -eglfs -evdev -gles2-only -gssapi -gtk -io-uring (-journald) -mysql -oci8 -odbc -postgres -renderdoc -sctp -test -tslib" ABI_X86="(64)" ^^ (dev-qt/qtbase-6.11.1:6/6.11.1::gentoo, マージ予定) USE="X concurrent dbus gui icu libinput libproxy network nls opengl sql sqlite ssl syslog udev vulkan wayland widgets xml (zstd) -accessibility -brotli -cups -custom-cflags -eglfs -evdev -gles2-only -gssapi -gtk -io-uring (-journald) -mysql -oci8 -odbc -postgres -renderdoc -sctp -test -tslib" ABI_X86="(64)" によって引き込まれました >=dev-qt/qtbase-6.10.1:6[gui,X] (kde-frameworks/kwindowsystem-6.27.0:6/6.27::gentoo, マージ予定) USE="X wayland -debug -test" ABI_X86="(64)" ^ この問題は、package.maskを使用して一方のパッケージが選択されないようにすることで解決できる可能性があります。しかし、競合する依存関係が存在し、それらを同時に満たすことが不可能である可能性もあります。そのような競合が2つの異なるパッケージの依存関係に存在する場合、それらのパッケージは同時にインストールできません。詳細については、emergeマニュアルページのMASKED PACKAGESセクションを参照するか、Gentoo Handbookを参照してください。続行するには、次のUSEフラグの変更が必要です(portage(5)マニュアルページの"package.use"を参照)。