#!/bin/bash # Erzwinge die Eingabe über das Terminal, damit 'curl | bash' interaktiv bleibt exec < /dev/tty CONFIG_FILE="$HOME/.ssh/config" CONFIG_BAK="$HOME/.ssh/config.bak.$(date +%F_%T)" # URL zur VERSCHLÜSSELTEN Config (passe den Dateinamen ggf. an) REMOTE_ENC_URL="https://git.1337733.xyz/martin/sshconfig/raw/branch/main/config.enc" echo "=== SSH Config Sync ===" echo "1) Lokale Config verschlüsseln (für den Upload in Git)" echo "2) Verschlüsselte Config aus dem Git entschlüsselt im Terminal ausgeben" echo "3) Merge: Remote Config entschlüsseln & lokal FEHLENDE Hosts ergänzen" echo "4) Sync: Remote Config entschlüsseln & lokale Version EXAKT überschreiben" echo "5) Lokal: Neuen SSH-Host interaktiv anlegen" echo "=======================" read -p "Wähle eine Option (1-5): " OPTION # Passwortabfrage nur für Optionen 1 bis 4 if [[ "$OPTION" =~ ^[1-4]$ ]]; then read -s -p "Verschlüsselungskennwort für Git-Sync: " PASS echo "" fi # Hilfsfunktion für den Download und die Entschlüsselung decrypt_remote() { curl -sL "$REMOTE_ENC_URL" | openssl enc -d -aes-256-cbc -pbkdf2 -iter 100000 -salt -pass pass:"$PASS" 2>/dev/null } case $OPTION in 1) if [ ! -f "$CONFIG_FILE" ]; then echo "Fehler: $CONFIG_FILE nicht gefunden!" exit 1 fi openssl enc -aes-256-cbc -pbkdf2 -iter 100000 -salt -in "$CONFIG_FILE" -out config.enc -pass pass:"$PASS" echo "Erfolg: Die Datei wurde als 'config.enc' im aktuellen Verzeichnis verschlüsselt." ;; 2) echo "--- Entschlüsselte Config ---" decrypt_remote || echo "Fehler: Falsches Passwort oder Download fehlgeschlagen." echo "-----------------------------" ;; 3) TMP_DEC=$(mktemp) decrypt_remote > "$TMP_DEC" if [ ! -s "$TMP_DEC" ]; then echo "Fehler: Entschlüsselung fehlgeschlagen (falsches Passwort/leere Datei)." rm -f "$TMP_DEC" exit 1 fi echo "Suche nach fehlenden Einträgen..." awk -v local_conf="$CONFIG_FILE" ' BEGIN { print_block = 0 } /^Host / { cmd = "grep -q \"^Host " $2 "$\" \"" local_conf "\"" if (system(cmd) == 0) { print_block = 0 } else { print_block = 1 print "\n# Merged from Git" } } { if (print_block == 1) print $0 }' "$TMP_DEC" >> "$CONFIG_FILE" echo "Erfolg: Fehlende Einträge wurden an $CONFIG_FILE angehängt." rm -f "$TMP_DEC" ;; 4) TMP_DEC=$(mktemp) decrypt_remote > "$TMP_DEC" if [ ! -s "$TMP_DEC" ]; then echo "Fehler: Entschlüsselung fehlgeschlagen." rm -f "$TMP_DEC" exit 1 fi if [ -f "$CONFIG_FILE" ]; then cp "$CONFIG_FILE" "$CONFIG_BAK" echo "Backup der lokalen Config unter $CONFIG_BAK erstellt." fi mv "$TMP_DEC" "$CONFIG_FILE" chmod 600 "$CONFIG_FILE" echo "Erfolg: Lokale Config wurde exakt mit der Git-Version synchronisiert (überschrieben)." ;; 5) echo "--- Neuen Host anlegen ---" read -p "Host Alias (z.B. 'webserver' oder 'pi'): " NEW_HOST # Validierung: Leerer Hostname macht keinen Sinn if [ -z "$NEW_HOST" ]; then echo "Fehler: Der Host Alias darf nicht leer sein. Abbruch." exit 1 fi read -p "HostName (IP-Adresse oder Domain): " NEW_HOSTNAME read -p "Benutzername (User, z.B. 'root'): " NEW_USER # Port mit Fallback auf 22 read -p "Port (Standard: 22 - Einfach Enter drücken): " NEW_PORT NEW_PORT=${NEW_PORT:-22} # Key-File mit Fallback auf den Standardpfad read -p "IdentityFile (Pfad zum Key, leer = ~/.ssh/id_rsa): " NEW_KEY # ServerAliveInterval Abfrage (Y/N) read -p "Soll ServerAliveInterval (Verhindert Timeout) gesetzt werden? (j/n): " ADD_ALIVE # Ins Config-File schreiben # Sicherstellen, dass das Verzeichnis existiert und Berechtigungen stimmen mkdir -p "$HOME/.ssh" chmod 700 "$HOME/.ssh" touch "$CONFIG_FILE" chmod 600 "$CONFIG_FILE" { echo "" echo "Host $NEW_HOST" [ -n "$NEW_HOSTNAME" ] && echo " HostName $NEW_HOSTNAME" [ -n "$NEW_USER" ] && echo " User $NEW_USER" echo " Port $NEW_PORT" [ -n "$NEW_KEY" ] && echo " IdentityFile $NEW_KEY" if [[ "$ADD_ALIVE" =~ ^[jJ]$ ]]; then echo " ServerAliveInterval 60" fi } >> "$CONFIG_FILE" echo "Erfolg: Host '$NEW_HOST' wurde erfolgreich zu $CONFIG_FILE hinzugefügt." echo "Tipp: Um diese Änderung ins Git zu pushen, nutze nun Option 1." ;; *) echo "Ungültige Auswahl. Abbruch." exit 1 ;; esac