aboutsummaryrefslogtreecommitdiffstats
path: root/bin/blackpearl-sshmenu.sh
blob: b0a0fc1534883cd8cae4e45e6c897288288720f3 (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
29
30
31
32
33
34
35
36
37
38
39
40
#!/bin/bash
# blackpearl-sshmenu.sh - the hosts in ~/.ssh/config as rofi cards
# Copyright (C) 2026 Danilo M. <danix@danix.xyz>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 2 as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.

# 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"