63 lines
1.5 KiB
Bash
63 lines
1.5 KiB
Bash
#!/bin/bash
|
||
|
||
KNOWN_HOSTS="$HOME/.ssh/known_hosts"
|
||
|
||
# Hosts extrahieren – ignoriert gehashte Zeilen
|
||
HOSTS=$(awk '
|
||
{
|
||
split($1, hosts, ",");
|
||
for (i in hosts)
|
||
if (substr(hosts[i], 1, 1) != "|")
|
||
print hosts[i];
|
||
}
|
||
' "$KNOWN_HOSTS" | sort -u)
|
||
|
||
# Eingabe mit fzf (Suchfenster)
|
||
INPUT=$( (echo "$HOSTS") | fzf --prompt="SSH zu Host (neu eingeben möglich): " --height=100% --layout=reverse --border --print-query)
|
||
|
||
# fzf gibt als erstes die Suchanfrage aus, dann die Auswahl
|
||
# split in erste Zeile (Query) und zweite Zeile (Auswahl)
|
||
readarray -t LINES <<< "$INPUT"
|
||
QUERY="${LINES[0]}"
|
||
SELECTED="${LINES[1]}"
|
||
|
||
# Wenn nichts eingegeben und nichts ausgewählt → Abbruch
|
||
if [[ -z "$QUERY" && -z "$SELECTED" ]]; then
|
||
exit 0
|
||
fi
|
||
|
||
# Wenn etwas ausgewählt wurde, nutze das, sonst das Query (freie Eingabe)
|
||
if [[ -n "$SELECTED" ]]; then
|
||
TARGET_RAW="$SELECTED"
|
||
else
|
||
TARGET_RAW="$QUERY"
|
||
fi
|
||
|
||
# Port & Host extrahieren aus Known Hosts Format [host]:port oder normal
|
||
if [[ "$TARGET_RAW" =~ ^\[([^\]]+)\]:(.+)$ ]]; then
|
||
HOST="${BASH_REMATCH[1]}"
|
||
PORT="${BASH_REMATCH[2]}"
|
||
else
|
||
HOST="$TARGET_RAW"
|
||
PORT=""
|
||
fi
|
||
|
||
# Port-Abfrage nur wenn kein Port aus known_hosts gesetzt
|
||
if [[ -z "$PORT" ]]; then
|
||
read -rp "🔢 Port (leer für 22): " PORT
|
||
PORT=${PORT:-22}
|
||
fi
|
||
|
||
# User-Abfrage
|
||
read -rp "👤 Benutzername (leer für aktuellen User: $USER): " SSH_USER
|
||
|
||
if [[ -n "$SSH_USER" ]]; then
|
||
TARGET="${SSH_USER}@${HOST}"
|
||
else
|
||
TARGET="$HOST"
|
||
fi
|
||
|
||
echo -e "\n🔌 Verbinde mit: $TARGET (Port $PORT)"
|
||
sleep 0.5
|
||
|
||
exec ssh -p "$PORT" "$TARGET" |