From 4b35947de144eadd2dfcb747eb00916b9ab14f03 Mon Sep 17 00:00:00 2001 From: martin <1+martin@noreply.localhost> Date: Sat, 16 May 2026 13:32:22 +0200 Subject: [PATCH] import_config.sh aktualisiert --- import_config.sh | 56 +++++++++++++++++++++++++++--------------------- 1 file changed, 32 insertions(+), 24 deletions(-) diff --git a/import_config.sh b/import_config.sh index 6eb8f89..a204e75 100644 --- a/import_config.sh +++ b/import_config.sh @@ -1,30 +1,30 @@ #!/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) +# URL zur VERSCHLÜSSELTEN Config (Passe die URL ggf. an deine Gitea-Instanz 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 "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" 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 +# 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 + read -s -p "Verschlüsselungskennwort für Git-Sync: " PASS < /dev/tty echo "" fi -# Hilfsfunktion für den Download und die Entschlüsselung +# 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 -pbkdf2 -iter 100000 -salt -pass pass:"$PASS" 2>/dev/null + curl -sL "$REMOTE_ENC_URL" | openssl enc -d -aes-256-cbc -a -pbkdf2 -iter 100000 -salt -pass pass:"$PASS" 2>/dev/null } case $OPTION in @@ -33,8 +33,10 @@ case $OPTION in 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." + # 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." ;; 2) echo "--- Entschlüsselte Config ---" @@ -51,6 +53,9 @@ case $OPTION in exit 1 fi + # Sicherstellen, dass die lokale Datei existiert + mkdir -p "$HOME/.ssh" && touch "$CONFIG_FILE" + echo "Suche nach fehlenden Einträgen..." awk -v local_conf="$CONFIG_FILE" ' BEGIN { print_block = 0 } @@ -67,6 +72,7 @@ case $OPTION in if (print_block == 1) print $0 }' "$TMP_DEC" >> "$CONFIG_FILE" + chmod 600 "$CONFIG_FILE" echo "Erfolg: Fehlende Einträge wurden an $CONFIG_FILE angehängt." rm -f "$TMP_DEC" ;; @@ -80,45 +86,47 @@ case $OPTION in exit 1 fi + # Backup der alten Config erstellen, falls vorhanden 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" - echo "Erfolg: Lokale Config wurde exakt mit der Git-Version synchronisiert (überschrieben)." + echo "Erfolg: Lokale Config wurde exakt mit der Git-Version synchronisiert." ;; 5) echo "--- Neuen Host anlegen ---" - read -p "Host Alias (z.B. 'webserver' oder 'pi'): " NEW_HOST + read -p "Host Alias (z.B. 'webserver' oder 'pi'): " NEW_HOST < /dev/tty - # 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 + 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 + 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 - read -p "IdentityFile (Pfad zum Key, leer = ~/.ssh/id_rsa): " NEW_KEY + # Key-File mit Fallback auf den Standardpfad (leer lassen) + read -p "IdentityFile (Pfad zum Key, leer = Standard-Keys nutzen): " NEW_KEY < /dev/tty - # ServerAliveInterval Abfrage (Y/N) - read -p "Soll ServerAliveInterval (Verhindert Timeout) gesetzt werden? (j/n): " ADD_ALIVE + # ServerAliveInterval Abfrage (j/n) + read -p "Soll ServerAliveInterval (Verhindert Timeout) gesetzt werden? (j/n): " ADD_ALIVE < /dev/tty - # Ins Config-File schreiben - # Sicherstellen, dass das Verzeichnis existiert und Berechtigungen stimmen + # 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" @@ -132,7 +140,7 @@ case $OPTION in } >> "$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 "Tipp: Um diese Änderung ins Git zu bringen, führe das Skript erneut aus und wähle Option 1." ;; *) echo "Ungültige Auswahl. Abbruch."