104 lines
2.2 KiB
Bash
104 lines
2.2 KiB
Bash
#!/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"
|