#!/bin/bash KNOWN_HOSTS="$HOME/.ssh/known_hosts" # --- Funktion: SSH-Verbindung aufbauen --- connect_ssh() { local host="$1" local port="$2" local user="$3" if [[ -n "$user" ]]; then TARGET="${user}@${host}" else TARGET="$host" fi echo -e "\n🔌 Verbinde mit: $TARGET (Port $port)" sleep 0.5 exec ssh -p "$port" "$TARGET" } # --- Wenn Parameter übergeben wurde, direkt nutzen --- if [[ -n "$1" ]]; then INPUT="$1" # user@host:port if [[ "$INPUT" =~ ^([^@]+)@([^:]+):([0-9]+)$ ]]; then SSH_USER="${BASH_REMATCH[1]}" HOST="${BASH_REMATCH[2]}" PORT="${BASH_REMATCH[3]}" # user@host elif [[ "$INPUT" =~ ^([^@]+)@(.+)$ ]]; then SSH_USER="${BASH_REMATCH[1]}" HOST="${BASH_REMATCH[2]}" PORT="22" # host:port elif [[ "$INPUT" =~ ^([^:]+):([0-9]+)$ ]]; then SSH_USER="" HOST="${BASH_REMATCH[1]}" PORT="${BASH_REMATCH[2]}" # host else SSH_USER="" HOST="$INPUT" PORT="22" fi connect_ssh "$HOST" "$PORT" "$SSH_USER" exit 0 fi # --- Hosts aus known_hosts im Format host:port extrahieren --- HOSTS=$(awk ' { split($1, hosts, ","); for (i in hosts) { if (substr(hosts[i], 1, 1) != "|") { if (match(hosts[i], /^\[.*\]:[0-9]+$/)) { hostport = hosts[i] gsub(/^\[/, "", hostport) gsub(/\]/, "", hostport) print hostport } else { print hosts[i] ":22" } } } } ' "$KNOWN_HOSTS" | sort -u) # --- Auswahl via fzf --- INPUT=$( (echo "$HOSTS") | fzf --prompt="SSH zu Host (z. B. host:port oder frei eingeben): " --height=100% --layout=reverse --border --print-query) readarray -t LINES <<< "$INPUT" QUERY="${LINES[0]}" SELECTED="${LINES[1]}" if [[ -z "$QUERY" && -z "$SELECTED" ]]; then exit 0 fi if [[ -n "$SELECTED" ]]; then TARGET_RAW="$SELECTED" else TARGET_RAW="$QUERY" fi # host:port erkennen if [[ "$TARGET_RAW" =~ ^([^:]+):([0-9]+)$ ]]; then HOST="${BASH_REMATCH[1]}" PORT="${BASH_REMATCH[2]}" else HOST="$TARGET_RAW" PORT="22" fi # Benutzername abfragen read -rp "👤 Benutzername (leer für aktuellen User: $USER): " SSH_USER [ -z "$SSH_USER" ] && SSH_USER="" connect_ssh "$HOST" "$PORT" "$SSH_USER"