Skip to content

Commit d5d8222

Browse files
committed
v1.3.0: SSH key auth release — docs, CHANGELOG, demo
- Bump version to 1.3.0. - Make `credential_ref` optional in hosts.toml so a key-only host with an unencrypted key needs no placeholder credential. - CHANGELOG: 1.3.0 section (SSH key auth, Shift+arrow reorder, optional credential_ref, in-session credential-failure and transient-status fixes). - Demo: re-recorded gif showing the SSH-key host's edit form and Ctrl+arrow reorder; demo config gains a key-authenticated host. Taller capture so the 9-field form fits. Quit with Esc (q now types into search).
1 parent ce4cf9b commit d5d8222

7 files changed

Lines changed: 60 additions & 25 deletions

File tree

CHANGELOG.md

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,31 @@
33
All notable changes to **gukab** are documented here.
44
This project follows [Semantic Versioning](https://semver.org).
55

6+
## [1.3.0] - 2026-06-23
7+
8+
### Added
9+
- **SSH key authentication.** A host can set an `identity_file` (private key path,
10+
e.g. `~/.ssh/id_ed25519`) — set it in the host form's new **SSH key file** field.
11+
Only the path is stored; the key material is never copied into `hosts.toml` or the
12+
keyring. Auth is tried in order: public key → password → keyboard-interactive →
13+
none. An encrypted key's passphrase is read from the host's keyring `credential_ref`
14+
(store it with `Ctrl+K`); a passphrase-less key needs no credential at all.
15+
Keys load via OpenSSH, legacy PEM (PKCS#1 `BEGIN RSA PRIVATE KEY`), PKCS#8, and
16+
PuTTY formats; a group/other-readable key file triggers a non-blocking warning.
17+
- **Reorder hosts with `Shift+↑` / `Shift+↓`** in addition to `Ctrl+↑` / `Ctrl+↓`
18+
on macOS `Ctrl+↑/↓` is intercepted by Mission Control before reaching the terminal.
19+
20+
### Changed
21+
- `credential_ref` is now optional in `hosts.toml` — a key-only host (or an in-band
22+
login switch) no longer needs a placeholder credential.
23+
24+
### Fixed
25+
- A failed expect-rule credential lookup (a missing or mistyped keyring ref) no
26+
longer tears down the live SSH session. It now warns once, disarms that rule, and
27+
lets you answer the prompt by hand.
28+
- Status-bar messages are transient again: a warning (e.g. "clear the search to
29+
reorder") is cleared on the next keypress, so the keybinding hints reappear.
30+
631
## [1.2.0] - 2026-06-18
732

833
### Added

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "gukab"
3-
version = "1.2.0"
3+
version = "1.3.0"
44
edition = "2024"
55
description = "A terminal-only (TUI) SSH connection manager for network devices."
66
license = "GPL-3.0-or-later"

docs/demo-home/.config/gukab/hosts.toml

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,19 +3,19 @@
33

44
[[groups]]
55
name = "Core"
6-
icon = ""
6+
icon = ""
77

88
[[groups]]
99
name = "Distribution"
10-
icon = ""
10+
icon = ""
1111

1212
[[groups]]
1313
name = "Access"
14-
icon = ""
14+
icon = ""
1515

1616
[[groups]]
1717
name = "Servers"
18-
icon = ""
18+
icon = ""
1919

2020
[[hosts]]
2121
name = "core-switch-01"
@@ -97,12 +97,13 @@ username = "netadmin"
9797
credential_ref = "demo"
9898
group = "Access"
9999

100+
# Key-authenticated host: only the key path is stored, no password/credential.
100101
[[hosts]]
101102
name = "srv-web-01"
102103
hostname = "10.0.3.10"
103104
port = 22
104105
username = "netadmin"
105-
credential_ref = "demo"
106+
identity_file = "~/.ssh/id_ed25519"
106107
group = "Servers"
107108

108109
[[hosts]]

docs/demo.gif

87.5 KB
Loading

docs/demo.tape

Lines changed: 23 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ Set Shell "bash"
88
Set FontFamily "FiraCode Nerd Font Mono"
99
Set FontSize 18
1010
Set Width 1200
11-
Set Height 700
11+
Set Height 820
1212
Set Theme "Catppuccin Mocha"
1313
Set Padding 18
1414
Set TypingSpeed 85ms
@@ -26,8 +26,20 @@ Down Sleep 250ms
2626
Down Sleep 250ms
2727
Down Sleep 250ms
2828
Down Sleep 250ms
29-
Down Sleep 250ms
30-
Sleep 800ms
29+
Sleep 700ms
30+
31+
# Reorder a host within its group (Ctrl+↑/↓; Shift+↑/↓ also works on macOS).
32+
Up Sleep 200ms
33+
Up Sleep 200ms
34+
Up Sleep 200ms
35+
Up Sleep 200ms
36+
Up Sleep 200ms
37+
Up Sleep 200ms
38+
Sleep 400ms
39+
Down Sleep 350ms
40+
Ctrl+Down Sleep 700ms
41+
Ctrl+Down Sleep 700ms
42+
Ctrl+Up Sleep 800ms
3143

3244
# Fuzzy search: substring filtering by group.
3345
Type "core" Sleep 1.6s
@@ -37,19 +49,12 @@ Backspace 4 Sleep 300ms
3749
Type "r3" Sleep 1.8s
3850
Backspace 2 Sleep 300ms
3951

40-
# Another fuzzy filter.
41-
Type "acc" Sleep 1.6s
42-
Backspace 3 Sleep 500ms
43-
44-
# Navigate the list.
45-
Down Sleep 350ms
46-
Down Sleep 350ms
47-
Down Sleep 350ms
48-
Up Sleep 450ms
49-
50-
# Open the Add Host form, then close it.
51-
Ctrl+N Sleep 2s
52-
Escape Sleep 700ms
52+
# SSH key auth: open a key-authenticated host in the edit form — note the
53+
# "SSH key file" field pointing at a private key (only the path is stored).
54+
Type "web" Sleep 1.2s
55+
Ctrl+E Sleep 2.6s
56+
Escape Sleep 600ms
57+
Backspace 3 Sleep 400ms
5358

54-
# Quit.
55-
Type "q" Sleep 1.2s
59+
# Quit (Esc — the search box is always live, so q types into it).
60+
Escape Sleep 1.2s

src/config/mod.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@ pub struct Host {
99
#[serde(default = "default_port")]
1010
pub port: u16,
1111
pub username: String,
12+
/// Keyring entry name for this host's secret: a login password, or the
13+
/// passphrase of `identity_file`. Optional — a key-only host with an
14+
/// unencrypted key (or a switch that logs in in-band) needs no secret.
15+
#[serde(default)]
1216
pub credential_ref: String,
1317
/// Path to a private key file (e.g. `~/.ssh/id_ed25519`). Empty = password auth.
1418
/// The key material is never copied into config or keyring — only this path is

0 commit comments

Comments
 (0)