blob: a94217e75748d6b5c566a541d622ce414f9fc848 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
#!/bin/bash
# SSH menu: the hosts in ~/.ssh/config as cards, rofi themed by udt.
# Copyright (C) 2026 Danilo M. <danix@danix.xyz>
# Licensed under the GNU General Public License v2 only.
# rofi's own ssh mode shows the alias only, so the config is read here.
# ponytail: plain "Keyword value" lines in ~/.ssh/config only; Include and
# Match are not followed, wildcard Host patterns are skipped.
mapfile -t hosts < <(awk '
function flush() { if (name != "") print name "\t" user "\t" addr }
tolower($1) == "host" { flush(); name = ($2 ~ /[*?]/) ? "" : $2; user = ""; addr = $2 }
tolower($1) == "hostname" { addr = $2 }
tolower($1) == "user" { user = $2 }
END { flush() }' ~/.ssh/config)
# Two lines a card: the alias, then "user · address" with the user only where
# the config sets one. Entries are joined on "|" so each can hold a newline.
entries=()
for h in "${hosts[@]}"; do
IFS=$'\t' read -r name user addr <<< "$h"
entries+=("<b>$name</b>
<span size='small' fgalpha='65%'>${user:+$user · }$addr</span>")
done
i=$(IFS='|'; printf '%s' "${entries[*]}" | rofi -dmenu -i -markup-rows \
-sep '|' -eh 2 -format i -p ' SSH:' -theme ~/.config/rofi/udt/ssh.rasi) || exit
name=${hosts[i]%%$'\t'*}
exec rofi-sensible-terminal -e ssh "$name"
|