import_config.sh hinzugefügt
This commit is contained in:
@@ -0,0 +1,141 @@
|
|||||||
|
#!/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)
|
||||||
|
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 "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
|
||||||
|
if [[ "$OPTION" =~ ^[1-4]$ ]]; then
|
||||||
|
read -s -p "Verschlüsselungskennwort für Git-Sync: " PASS
|
||||||
|
echo ""
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Hilfsfunktion für den Download und die Entschlüsselung
|
||||||
|
decrypt_remote() {
|
||||||
|
curl -sL "$REMOTE_ENC_URL" | openssl enc -d -aes-256-cbc -pbkdf2 -iter 100000 -salt -pass pass:"$PASS" 2>/dev/null
|
||||||
|
}
|
||||||
|
|
||||||
|
case $OPTION in
|
||||||
|
1)
|
||||||
|
if [ ! -f "$CONFIG_FILE" ]; then
|
||||||
|
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."
|
||||||
|
;;
|
||||||
|
2)
|
||||||
|
echo "--- Entschlüsselte Config ---"
|
||||||
|
decrypt_remote || echo "Fehler: Falsches Passwort oder Download fehlgeschlagen."
|
||||||
|
echo "-----------------------------"
|
||||||
|
;;
|
||||||
|
3)
|
||||||
|
TMP_DEC=$(mktemp)
|
||||||
|
decrypt_remote > "$TMP_DEC"
|
||||||
|
|
||||||
|
if [ ! -s "$TMP_DEC" ]; then
|
||||||
|
echo "Fehler: Entschlüsselung fehlgeschlagen (falsches Passwort/leere Datei)."
|
||||||
|
rm -f "$TMP_DEC"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
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"
|
||||||
|
|
||||||
|
echo "Erfolg: Fehlende Einträge wurden an $CONFIG_FILE angehängt."
|
||||||
|
rm -f "$TMP_DEC"
|
||||||
|
;;
|
||||||
|
4)
|
||||||
|
TMP_DEC=$(mktemp)
|
||||||
|
decrypt_remote > "$TMP_DEC"
|
||||||
|
|
||||||
|
if [ ! -s "$TMP_DEC" ]; then
|
||||||
|
echo "Fehler: Entschlüsselung fehlgeschlagen."
|
||||||
|
rm -f "$TMP_DEC"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -f "$CONFIG_FILE" ]; then
|
||||||
|
cp "$CONFIG_FILE" "$CONFIG_BAK"
|
||||||
|
echo "Backup der lokalen Config unter $CONFIG_BAK erstellt."
|
||||||
|
fi
|
||||||
|
|
||||||
|
mv "$TMP_DEC" "$CONFIG_FILE"
|
||||||
|
chmod 600 "$CONFIG_FILE"
|
||||||
|
echo "Erfolg: Lokale Config wurde exakt mit der Git-Version synchronisiert (überschrieben)."
|
||||||
|
;;
|
||||||
|
5)
|
||||||
|
echo "--- Neuen Host anlegen ---"
|
||||||
|
read -p "Host Alias (z.B. 'webserver' oder 'pi'): " NEW_HOST
|
||||||
|
|
||||||
|
# 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
|
||||||
|
|
||||||
|
# Port mit Fallback auf 22
|
||||||
|
read -p "Port (Standard: 22 - Einfach Enter drücken): " NEW_PORT
|
||||||
|
NEW_PORT=${NEW_PORT:-22}
|
||||||
|
|
||||||
|
# Key-File mit Fallback auf den Standardpfad
|
||||||
|
read -p "IdentityFile (Pfad zum Key, leer = ~/.ssh/id_rsa): " NEW_KEY
|
||||||
|
|
||||||
|
# ServerAliveInterval Abfrage (Y/N)
|
||||||
|
read -p "Soll ServerAliveInterval (Verhindert Timeout) gesetzt werden? (j/n): " ADD_ALIVE
|
||||||
|
|
||||||
|
# Ins Config-File schreiben
|
||||||
|
# Sicherstellen, dass das Verzeichnis existiert und Berechtigungen stimmen
|
||||||
|
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' wurde erfolgreich zu $CONFIG_FILE hinzugefügt."
|
||||||
|
echo "Tipp: Um diese Änderung ins Git zu pushen, nutze nun Option 1."
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Ungültige Auswahl. Abbruch."
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
Reference in New Issue
Block a user