diff --git a/import_config.sh b/import_config.sh new file mode 100644 index 0000000..6eb8f89 --- /dev/null +++ b/import_config.sh @@ -0,0 +1,141 @@ +#!/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 \ No newline at end of file