Files
sshconfig/import_config.sh
T
2026-05-16 13:47:25 +02:00

154 lines
5.6 KiB
Bash

#!/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 in deiner Gitea-Instanz
REMOTE_ENC_URL="https://git.1337733.xyz/martin/sshconfig/raw/branch/main/config.enc"
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"
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 < /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 ""
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
1)
if [ ! -f "$CONFIG_FILE" ]; then
echo "Fehler: $CONFIG_FILE nicht gefunden!"
exit 1
fi
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 ---"
curl -sL "$REMOTE_ENC_URL" | age -d < /dev/tty
echo "-----------------------------"
;;
3)
TMP_DEC=$(mktemp)
echo "Lade Git-Config herunter. age benötigt nun das Kennwort..."
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
# 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 }
/^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"
chmod 600 "$CONFIG_FILE"
echo "Erfolg: Fehlende Einträge wurden an $CONFIG_FILE angehängt."
rm -f "$TMP_DEC"
;;
4)
TMP_DEC=$(mktemp)
echo "Lade Git-Config herunter. age benötigt nun das Kennwort..."
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
# 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
mkdir -p "$HOME/.ssh"
mv "$TMP_DEC" "$CONFIG_FILE"
chmod 600 "$CONFIG_FILE"
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 < /dev/tty
if [ -z "$NEW_HOST" ]; then
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
read -p "Port (Standard: 22 - Einfach Enter drücken): " NEW_PORT < /dev/tty
NEW_PORT=${NEW_PORT:-22}
# 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
read -p "Soll ServerAliveInterval gesetzt werden? (j/n): " ADD_ALIVE < /dev/tty
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' hinzugefügt."
;;
*)
echo "Ungültige Auswahl."
exit 1
;;
esac