diff options
Diffstat (limited to 'config/hypr/scripts/rofi-ssh-menu.sh')
| -rwxr-xr-x | config/hypr/scripts/rofi-ssh-menu.sh | 117 |
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 |
