import_config.sh aktualisiert
This commit is contained in:
+42
-37
@@ -1,11 +1,18 @@
|
|||||||
#!/bin/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_FILE="$HOME/.ssh/config"
|
||||||
CONFIG_BAK="$HOME/.ssh/config.bak.$(date +%F_%T)"
|
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"
|
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 "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 "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 "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 "5) Lokal: Neuen SSH-Host interaktiv anlegen"
|
||||||
echo "======================="
|
echo "======================="
|
||||||
|
|
||||||
# Liest die Auswahl direkt vom Terminal, um Pipe-Kompatibilität zu sichern
|
|
||||||
read -p "Wähle eine Option (1-5): " OPTION < /dev/tty
|
read -p "Wähle eine Option (1-5): " OPTION < /dev/tty
|
||||||
|
|
||||||
# Passwortabfrage nur für die Git-Verschlüsselungs-Optionen 1 bis 4
|
# Hilfsfunktion, die nach dem Download und der Entschlüsselung nach dem lokalen SSH-Key fragt
|
||||||
if [[ "$OPTION" =~ ^[1-4]$ ]]; then
|
replace_identity_file() {
|
||||||
read -s -p "Verschlüsselungskennwort für Git-Sync: " PASS < /dev/tty
|
local target_file="$1"
|
||||||
echo ""
|
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() {
|
if [ -n "$LOCAL_KEY" ]; then
|
||||||
curl -sL "$REMOTE_ENC_URL" | openssl enc -d -aes-256-cbc -a -pbkdf2 -iter 100000 -salt -pass pass:"$PASS" 2>/dev/null
|
# 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
|
case $OPTION in
|
||||||
@@ -33,29 +42,30 @@ case $OPTION in
|
|||||||
echo "Fehler: $CONFIG_FILE nicht gefunden!"
|
echo "Fehler: $CONFIG_FILE nicht gefunden!"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
# Verschlüsselt im aktuellen Verzeichnis als reine Textdatei (Base64 dank -a)
|
echo "age wird dich nun nach einem Verschlüsselungskennwort fragen..."
|
||||||
openssl enc -aes-256-cbc -a -pbkdf2 -iter 100000 -salt -in "$CONFIG_FILE" -out config.enc -pass pass:"$PASS"
|
# -p = Passphrase Modus, -a = ASCII Armor (Base64), -o = Output
|
||||||
echo "Erfolg: Die Datei wurde als textbasierte 'config.enc' im aktuellen Verzeichnis erstellt."
|
age -p -a -o config.enc "$CONFIG_FILE" < /dev/tty
|
||||||
echo "Du kannst den Inhalt jetzt öffnen, kopieren und in Gitea einfügen."
|
echo "Erfolg: Die Datei wurde als 'config.enc' (Textformat) erstellt."
|
||||||
;;
|
;;
|
||||||
2)
|
2)
|
||||||
echo "--- Entschlüsselte Config ---"
|
echo "--- Entschlüsselte Config ---"
|
||||||
decrypt_remote || echo "Fehler: Falsches Passwort oder Download fehlgeschlagen."
|
curl -sL "$REMOTE_ENC_URL" | age -d < /dev/tty
|
||||||
echo "-----------------------------"
|
echo "-----------------------------"
|
||||||
;;
|
;;
|
||||||
3)
|
3)
|
||||||
TMP_DEC=$(mktemp)
|
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 (falsches Passwort/leere Datei)."
|
echo "Fehler: Entschlüsselung fehlgeschlagen (falsches Passwort/Netzwerkfehler)."
|
||||||
rm -f "$TMP_DEC"
|
rm -f "$TMP_DEC"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Sicherstellen, dass die lokale Datei existiert
|
# IdentityFile automatisch für dieses System anpassen
|
||||||
mkdir -p "$HOME/.ssh" && touch "$CONFIG_FILE"
|
replace_identity_file "$TMP_DEC"
|
||||||
|
|
||||||
|
mkdir -p "$HOME/.ssh" && touch "$CONFIG_FILE"
|
||||||
echo "Suche nach fehlenden Einträgen..."
|
echo "Suche nach fehlenden Einträgen..."
|
||||||
awk -v local_conf="$CONFIG_FILE" '
|
awk -v local_conf="$CONFIG_FILE" '
|
||||||
BEGIN { print_block = 0 }
|
BEGIN { print_block = 0 }
|
||||||
@@ -78,21 +88,22 @@ case $OPTION in
|
|||||||
;;
|
;;
|
||||||
4)
|
4)
|
||||||
TMP_DEC=$(mktemp)
|
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."
|
echo "Fehler: Entschlüsselung fehlgeschlagen."
|
||||||
rm -f "$TMP_DEC"
|
rm -f "$TMP_DEC"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
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
|
if [ -f "$CONFIG_FILE" ]; then
|
||||||
cp "$CONFIG_FILE" "$CONFIG_BAK"
|
cp "$CONFIG_FILE" "$CONFIG_BAK"
|
||||||
echo "Backup der lokalen Config unter $CONFIG_BAK erstellt."
|
echo "Backup der lokalen Config unter $CONFIG_BAK erstellt."
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Exakter Sync (Überschreiben)
|
|
||||||
mkdir -p "$HOME/.ssh"
|
mkdir -p "$HOME/.ssh"
|
||||||
mv "$TMP_DEC" "$CONFIG_FILE"
|
mv "$TMP_DEC" "$CONFIG_FILE"
|
||||||
chmod 600 "$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
|
read -p "Host Alias (z.B. 'webserver' oder 'pi'): " NEW_HOST < /dev/tty
|
||||||
|
|
||||||
if [ -z "$NEW_HOST" ]; then
|
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
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
read -p "HostName (IP-Adresse oder Domain): " NEW_HOSTNAME < /dev/tty
|
read -p "HostName (IP-Adresse oder Domain): " NEW_HOSTNAME < /dev/tty
|
||||||
read -p "Benutzername (User, z.B. 'root'): " NEW_USER < /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
|
read -p "Port (Standard: 22 - Einfach Enter drücken): " NEW_PORT < /dev/tty
|
||||||
NEW_PORT=${NEW_PORT:-22}
|
NEW_PORT=${NEW_PORT:-22}
|
||||||
|
|
||||||
# Key-File mit Fallback auf den Standardpfad (leer lassen)
|
# Hier trägst du idealerweise einen Platzhalter ein, der später überschrieben wird
|
||||||
read -p "IdentityFile (Pfad zum Key, leer = Standard-Keys nutzen): " NEW_KEY < /dev/tty
|
read -p "IdentityFile (z.B. Platzhalter 'IDENTITY_PLACEHOLDER' oder lokaler Pfad): " NEW_KEY < /dev/tty
|
||||||
|
|
||||||
# ServerAliveInterval Abfrage (j/n)
|
read -p "Soll ServerAliveInterval gesetzt werden? (j/n): " ADD_ALIVE < /dev/tty
|
||||||
read -p "Soll ServerAliveInterval (Verhindert Timeout) gesetzt werden? (j/n): " ADD_ALIVE < /dev/tty
|
|
||||||
|
|
||||||
# Ordnerstrukturen und Rechte absichern
|
|
||||||
mkdir -p "$HOME/.ssh"
|
mkdir -p "$HOME/.ssh"
|
||||||
chmod 700 "$HOME/.ssh"
|
chmod 700 "$HOME/.ssh"
|
||||||
touch "$CONFIG_FILE"
|
touch "$CONFIG_FILE"
|
||||||
chmod 600 "$CONFIG_FILE"
|
chmod 600 "$CONFIG_FILE"
|
||||||
|
|
||||||
# Host-Eintrag generieren
|
|
||||||
{
|
{
|
||||||
echo ""
|
echo ""
|
||||||
echo "Host $NEW_HOST"
|
echo "Host $NEW_HOST"
|
||||||
@@ -139,11 +145,10 @@ case $OPTION in
|
|||||||
fi
|
fi
|
||||||
} >> "$CONFIG_FILE"
|
} >> "$CONFIG_FILE"
|
||||||
|
|
||||||
echo "Erfolg: Host '$NEW_HOST' wurde erfolgreich zu $CONFIG_FILE hinzugefügt."
|
echo "Erfolg: Host '$NEW_HOST' hinzugefügt."
|
||||||
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."
|
echo "Ungültige Auswahl."
|
||||||
exit 1
|
exit 1
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
Reference in New Issue
Block a user