aboutsummaryrefslogtreecommitdiffstats
path: root/config/hypr/scripts/rofi-ssh-menu.sh
diff options
context:
space:
mode:
Diffstat (limited to 'config/hypr/scripts/rofi-ssh-menu.sh')
-rwxr-xr-xconfig/hypr/scripts/rofi-ssh-menu.sh117
1 files changed, 117 insertions, 0 deletions
diff --git a/config/hypr/scripts/rofi-ssh-menu.sh b/config/hypr/scripts/rofi-ssh-menu.sh
new file mode 100755
index 00000000..d1640c66
--- /dev/null
+++ b/config/hypr/scripts/rofi-ssh-menu.sh
@@ -0,0 +1,117 @@
+#!/usr/bin/env bash
+# ==================================================
+# KoolDots (2026)
+# Project URL: https://github.com/LinuxBeginnings
+# License: GNU GPLv3
+# SPDX-License-Identifier: GPL-3.0-or-later
+# ==================================================
+# Rofi SSH menu - list SSH hosts from ~/.ssh/config and connect.
+
+set -euo pipefail
+
+SSH_CONFIG="${HOME}/.ssh/config"
+ROFI_CONFIG="${HOME}/.config/rofi/config.rasi"
+MSG='Select a host to connect via SSH'
+
+notify() {
+ if command -v notify-send >/dev/null 2>&1; then
+ notify-send -u low "Rofi SSH" "$1"
+ else
+ printf '%s\n' "$1" >&2
+ fi
+}
+
+if [[ ! -f "${SSH_CONFIG}" ]]; then
+ notify "SSH config not found: ${SSH_CONFIG}"
+ exit 1
+fi
+
+# Build list: host|user|hostname
+host_entries="$(
+ awk '
+ function is_wildcard(h) { return (h ~ /[*?]/ || h ~ /^!/); }
+ function remember_hosts(list, i, n, h) {
+ delete current
+ n = split(list, parts, /[ \t]+/)
+ for (i = 1; i <= n; i++) {
+ h = parts[i]
+ if (h == "") continue
+ if (is_wildcard(h)) continue
+ current[h] = 1
+ if (!(h in seen)) {
+ seen[h] = 1
+ order[++count] = h
+ }
+ }
+ }
+ {
+ sub(/[ \t]*#.*/, "", $0)
+ if ($0 ~ /^[ \t]*$/) next
+ if ($1 == "Host") {
+ $1 = ""
+ sub(/^[ \t]+/, "", $0)
+ remember_hosts($0)
+ next
+ }
+ if ($1 == "HostName") {
+ for (h in current) hostname[h] = $2
+ next
+ }
+ if ($1 == "User") {
+ for (h in current) user[h] = $2
+ next
+ }
+ }
+ END {
+ for (i = 1; i <= count; i++) {
+ h = order[i]
+ print h "|" (h in user ? user[h] : "") "|" (h in hostname ? hostname[h] : "")
+ }
+ }
+ ' "${SSH_CONFIG}"
+)"
+
+if [[ -z "${host_entries}" ]]; then
+ notify "No SSH hosts found in ${SSH_CONFIG}"
+ exit 1
+fi
+
+menu_entries="$(
+ while IFS='|' read -r host user hostname; do
+ [[ -n "${host}" ]] || continue
+ [[ -n "${user}" ]] || user="${USER}"
+ [[ -n "${hostname}" ]] || hostname="${host}"
+ printf '%s | %s@%s\n' "${host}" "${user}" "${hostname}"
+ done <<< "${host_entries}"
+)"
+
+# Close any existing rofi before launching
+if pgrep -x "rofi" >/dev/null 2>&1; then
+ pkill rofi
+fi
+
+selection="$(printf '%s\n' "${menu_entries}" | rofi -dmenu -i -p "SSH" -mesg "${MSG}" -config "${ROFI_CONFIG}")"
+
+if [[ -z "${selection}" ]]; then
+ exit 0
+fi
+
+selected_host="${selection%% | *}"
+if [[ -z "${selected_host}" ]]; then
+ exit 0
+fi
+
+if command -v kitty >/dev/null 2>&1; then
+ exec kitty --title "SSH ${selected_host}" sh -lc "ssh ${selected_host}"
+fi
+
+if command -v ghostty >/dev/null 2>&1; then
+ exec ghostty -e sh -lc "ssh ${selected_host}"
+fi
+
+if command -v alacritty >/dev/null 2>&1; then
+ exec alacritty -e sh -lc "ssh ${selected_host}"
+fi
+
+notify "No supported terminal found (kitty, ghostty, alacritty). Unable to start SSH session."
+exit 1
send patches to the email below
yukais@pinapelz.com
include the subject [PATCH repo_name]
pinapelz.com
homepage