#!/usr/bin/env bash # # encrypt-vault-strings-to-file.sh # # Gegenstück zu deinem Decrypt-Script. # # Funktionen: # 1. Komplettes File mit ansible-vault encrypt verschlüsseln # 2. YAML-Datei mit key: value Zeilen in key: !vault | Blöcke umwandeln # 3. Einzelnen String verschlüsseln (Argument, Pipe oder interaktiv) # # Vault-Passwortdatei: ~/.vault-pass # set -euo pipefail VAULT_PASS_FILE="${HOME}/.vault-pass" ######################################## # Hilfe anzeigen ######################################## show_help() { cat <&2 exit 1 fi ######################################## # Optionales Output-File (-o) ######################################## local out_file="" if [[ "${1:-}" == "-o" && -n "${2:-}" ]]; then out_file="$2" shift 2 fi ######################################## # --- 1) File als Argument --- ######################################## if [[ -n "${1:-}" && -f "$1" ]]; then local f="$1" # Fall A: Datei ist bereits vollständig vault-verschlüsselt if [[ "$(head -n1 "$f")" == "\$ANSIBLE_VAULT;1.1;AES256"* ]]; then echo "File already encrypted (ANSIBLE_VAULT header found): $f" >&2 return 0 fi # Fall B: YAML mit key: value Zeilen if grep -Eq '^[[:space:]]*[A-Za-z0-9_.-]+:[[:space:]]*[^#].*$' "$f"; then local tmpout tmpout="$(mktemp)" # Datei zeilenweise lesen while IFS= read -r line || [[ -n "$line" ]]; do # Leere Zeilen oder Kommentare unverändert übernehmen if [[ -z "$line" || "$line" =~ ^[[:space:]]*# ]]; then printf '%s\n' "$line" >> "$tmpout" continue fi # Bereits verschlüsselte !vault Einträge nicht verändern if echo "$line" | grep -q '\!vault'; then printf '%s\n' "$line" >> "$tmpout" continue fi # Einfache key: value Zeilen erkennen if [[ "$line" =~ ^([[:space:]]*)([A-Za-z0-9_.-]+):[[:space:]]*(.+)$ ]]; then local indent="${BASH_REMATCH[1]}" local key="${BASH_REMATCH[2]}" local value="${BASH_REMATCH[3]}" # YAML-Blockindikatoren nicht verändern if [[ "$value" == "|" || "$value" == ">" || "$value" == "" ]]; then printf '%s\n' "$line" >> "$tmpout" continue fi # Leichte Bereinigung von Quotes value="${value%\"}"; value="${value#\"}" value="${value%\'}"; value="${value#\'}" # Verschlüsselung via ansible-vault encrypt_string while IFS= read -r enc_line; do printf '%s%s\n' "$indent" "$enc_line" >> "$tmpout" done < <( printf '%s' "$value" | ansible-vault encrypt_string \ --stdin-name "$key" \ --vault-password-file "$VAULT_PASS_FILE" ) else # Nicht passende Zeilen unverändert übernehmen printf '%s\n' "$line" >> "$tmpout" fi done < "$f" # Output schreiben if [[ -n "$out_file" ]]; then mv "$tmpout" "$out_file" echo "Encrypted YAML written to: $out_file" >&2 else cat "$tmpout" rm -f "$tmpout" fi return 0 fi # Fall C: Normale Datei → komplett verschlüsseln (in-place) ansible-vault encrypt \ --vault-password-file "$VAULT_PASS_FILE" \ "$f" echo "Encrypted file in-place: $f" >&2 return 0 fi ######################################## # --- 2) String-Verschlüsselung --- ######################################## local str="" local name="secret" # String als Argument if [[ -n "${1:-}" ]]; then str="$1" # String via Pipe elif [[ ! -t 0 ]]; then str="$(cat)" # Interaktiver Modus else echo "Interactive mode." read -r -p "Variable name (default: secret): " name_in if [[ -n "$name_in" ]]; then name="$name_in" fi echo "Paste plaintext and press Ctrl-D to confirm:" str="$(cat)" echo fi # Ausgabe als YAML-kompatibler !vault Block printf '%s' "$str" | ansible-vault encrypt_string \ --stdin-name "$name" \ --vault-password-file "$VAULT_PASS_FILE" } ######################################## # Script starten ######################################## vencr "$@"