import_config.sh aktualisiert

This commit is contained in:
2026-05-16 13:47:25 +02:00
parent 52e4168efa
commit ea073dbbf8
+41 -36
View File
@@ -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
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
# 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
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