From ea073dbbf80a73ed8b023fb168943df6097c69bb Mon Sep 17 00:00:00 2001 From: martin <1+martin@noreply.localhost> Date: Sat, 16 May 2026 13:47:25 +0200 Subject: [PATCH] import_config.sh aktualisiert --- import_config.sh | 79 +++++++++++++++++++++++++----------------------- 1 file changed, 42 insertions(+), 37 deletions(-) diff --git a/import_config.sh b/import_config.sh index a204e75..22e0715 100644 --- a/import_config.sh +++ b/import_config.sh @@ -1,11 +1,18 @@ #!/bin/bash +# Prüfen, ob age installiert ist +if ! command -v age >/dev/null 2>&1; then + echo "Fehler: Das Tool 'age' ist nicht installiert." + echo "Bitte installiere es (z.B. via 'sudo pacman -S age' oder 'apt install age')." + exit 1 +fi + CONFIG_FILE="$HOME/.ssh/config" CONFIG_BAK="$HOME/.ssh/config.bak.$(date +%F_%T)" -# URL zur VERSCHLÜSSELTEN Config (Passe die URL ggf. an deine Gitea-Instanz an) +# URL zur VERSCHLÜSSELTEN Config in deiner Gitea-Instanz REMOTE_ENC_URL="https://git.1337733.xyz/martin/sshconfig/raw/branch/main/config.enc" -echo "=== SSH Config Sync ===" +echo "=== SSH Config Sync (Secured by age) ===" echo "1) Lokale Config verschlüsseln (für den Upload/Copy-Paste 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" @@ -13,18 +20,20 @@ echo "4) Sync: Remote Config entschlüsseln & lokale Version EXAKT überschreibe echo "5) Lokal: Neuen SSH-Host interaktiv anlegen" echo "=======================" -# Liest die Auswahl direkt vom Terminal, um Pipe-Kompatibilität zu sichern read -p "Wähle eine Option (1-5): " OPTION < /dev/tty -# Passwortabfrage nur für die Git-Verschlüsselungs-Optionen 1 bis 4 -if [[ "$OPTION" =~ ^[1-4]$ ]]; then - read -s -p "Verschlüsselungskennwort für Git-Sync: " PASS < /dev/tty +# Hilfsfunktion, die nach dem Download und der Entschlüsselung nach dem lokalen SSH-Key fragt +replace_identity_file() { + local target_file="$1" echo "" -fi - -# Hilfsfunktion für den Download und die Entschlüsselung (inklusive Base64-Dekodierung via -a) -decrypt_remote() { - curl -sL "$REMOTE_ENC_URL" | openssl enc -d -aes-256-cbc -a -pbkdf2 -iter 100000 -salt -pass pass:"$PASS" 2>/dev/null + echo "--- Lokale Anpassung ---" + read -p "Pfad zum lokalen SSH-Key (z.B. ~/.ssh/id_ed25519) [Leer lassen für keine Änderung]: " LOCAL_KEY < /dev/tty + + if [ -n "$LOCAL_KEY" ]; then + # Ersetzt alle vorhandenen 'IdentityFile'-Einträge durch den angegebenen Pfad + sed -i "s|^[ \t]*IdentityFile.*| IdentityFile $LOCAL_KEY|" "$target_file" + echo "Erfolg: Alle IdentityFile-Einträge wurden für diesen PC auf '$LOCAL_KEY' geändert." + fi } case $OPTION in @@ -33,29 +42,30 @@ case $OPTION in echo "Fehler: $CONFIG_FILE nicht gefunden!" exit 1 fi - # Verschlüsselt im aktuellen Verzeichnis als reine Textdatei (Base64 dank -a) - openssl enc -aes-256-cbc -a -pbkdf2 -iter 100000 -salt -in "$CONFIG_FILE" -out config.enc -pass pass:"$PASS" - echo "Erfolg: Die Datei wurde als textbasierte 'config.enc' im aktuellen Verzeichnis erstellt." - echo "Du kannst den Inhalt jetzt öffnen, kopieren und in Gitea einfügen." + echo "age wird dich nun nach einem Verschlüsselungskennwort fragen..." + # -p = Passphrase Modus, -a = ASCII Armor (Base64), -o = Output + age -p -a -o config.enc "$CONFIG_FILE" < /dev/tty + echo "Erfolg: Die Datei wurde als 'config.enc' (Textformat) erstellt." ;; 2) echo "--- Entschlüsselte Config ---" - decrypt_remote || echo "Fehler: Falsches Passwort oder Download fehlgeschlagen." + curl -sL "$REMOTE_ENC_URL" | age -d < /dev/tty echo "-----------------------------" ;; 3) TMP_DEC=$(mktemp) - decrypt_remote > "$TMP_DEC" + echo "Lade Git-Config herunter. age benötigt nun das Kennwort..." - if [ ! -s "$TMP_DEC" ]; then - echo "Fehler: Entschlüsselung fehlgeschlagen (falsches Passwort/leere Datei)." + if ! curl -sL "$REMOTE_ENC_URL" | age -d > "$TMP_DEC" 2>/dev/null < /dev/tty; then + echo "Fehler: Entschlüsselung fehlgeschlagen (falsches Passwort/Netzwerkfehler)." rm -f "$TMP_DEC" exit 1 fi - # Sicherstellen, dass die lokale Datei existiert - mkdir -p "$HOME/.ssh" && touch "$CONFIG_FILE" + # IdentityFile automatisch für dieses System anpassen + replace_identity_file "$TMP_DEC" + mkdir -p "$HOME/.ssh" && touch "$CONFIG_FILE" echo "Suche nach fehlenden Einträgen..." awk -v local_conf="$CONFIG_FILE" ' BEGIN { print_block = 0 } @@ -78,21 +88,22 @@ case $OPTION in ;; 4) TMP_DEC=$(mktemp) - decrypt_remote > "$TMP_DEC" + echo "Lade Git-Config herunter. age benötigt nun das Kennwort..." - if [ ! -s "$TMP_DEC" ]; then + if ! curl -sL "$REMOTE_ENC_URL" | age -d > "$TMP_DEC" 2>/dev/null < /dev/tty; then echo "Fehler: Entschlüsselung fehlgeschlagen." rm -f "$TMP_DEC" exit 1 fi - # Backup der alten Config erstellen, falls vorhanden + # IdentityFile automatisch für dieses System anpassen + replace_identity_file "$TMP_DEC" + if [ -f "$CONFIG_FILE" ]; then cp "$CONFIG_FILE" "$CONFIG_BAK" echo "Backup der lokalen Config unter $CONFIG_BAK erstellt." fi - # Exakter Sync (Überschreiben) mkdir -p "$HOME/.ssh" mv "$TMP_DEC" "$CONFIG_FILE" chmod 600 "$CONFIG_FILE" @@ -103,30 +114,25 @@ case $OPTION in read -p "Host Alias (z.B. 'webserver' oder 'pi'): " NEW_HOST < /dev/tty if [ -z "$NEW_HOST" ]; then - echo "Fehler: Der Host Alias darf nicht leer sein. Abbruch." + echo "Fehler: Der Host Alias darf nicht leer sein." exit 1 fi read -p "HostName (IP-Adresse oder Domain): " NEW_HOSTNAME < /dev/tty read -p "Benutzername (User, z.B. 'root'): " NEW_USER < /dev/tty - - # Port mit Fallback auf 22 read -p "Port (Standard: 22 - Einfach Enter drücken): " NEW_PORT < /dev/tty NEW_PORT=${NEW_PORT:-22} - # Key-File mit Fallback auf den Standardpfad (leer lassen) - read -p "IdentityFile (Pfad zum Key, leer = Standard-Keys nutzen): " NEW_KEY < /dev/tty + # Hier trägst du idealerweise einen Platzhalter ein, der später überschrieben wird + read -p "IdentityFile (z.B. Platzhalter 'IDENTITY_PLACEHOLDER' oder lokaler Pfad): " NEW_KEY < /dev/tty - # ServerAliveInterval Abfrage (j/n) - read -p "Soll ServerAliveInterval (Verhindert Timeout) gesetzt werden? (j/n): " ADD_ALIVE < /dev/tty + read -p "Soll ServerAliveInterval gesetzt werden? (j/n): " ADD_ALIVE < /dev/tty - # Ordnerstrukturen und Rechte absichern mkdir -p "$HOME/.ssh" chmod 700 "$HOME/.ssh" touch "$CONFIG_FILE" chmod 600 "$CONFIG_FILE" - # Host-Eintrag generieren { echo "" echo "Host $NEW_HOST" @@ -139,11 +145,10 @@ case $OPTION in fi } >> "$CONFIG_FILE" - echo "Erfolg: Host '$NEW_HOST' wurde erfolgreich zu $CONFIG_FILE hinzugefügt." - echo "Tipp: Um diese Änderung ins Git zu bringen, führe das Skript erneut aus und wähle Option 1." + echo "Erfolg: Host '$NEW_HOST' hinzugefügt." ;; *) - echo "Ungültige Auswahl. Abbruch." + echo "Ungültige Auswahl." exit 1 ;; esac \ No newline at end of file