Add/refactor encrytion- and decryption scripts.
This commit is contained in:
Executable
+221
@@ -0,0 +1,221 @@
|
||||
#!/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
|
||||
|
||||
########################################
|
||||
# Hilfe anzeigen
|
||||
########################################
|
||||
show_help() {
|
||||
cat <<EOF
|
||||
Usage:
|
||||
$(basename "$0") [OPTION] [INPUT]
|
||||
|
||||
Modes:
|
||||
|
||||
1) File encrypt (in-place):
|
||||
$(basename "$0") secrets.txt
|
||||
|
||||
2) YAML file (key: value → !vault block):
|
||||
$(basename "$0") vars.yml
|
||||
$(basename "$0") -o output.yml vars.yml
|
||||
|
||||
Force whole-file encryption for a YAML file:
|
||||
$(basename "$0") --full-file vars.yml
|
||||
|
||||
3) String encrypt:
|
||||
$(basename "$0") 'mySecret'
|
||||
echo 'mySecret' | $(basename "$0")
|
||||
$(basename "$0") (interactive mode)
|
||||
|
||||
Options:
|
||||
-o FILE Write YAML output to FILE instead of stdout
|
||||
--full-file Encrypt the given file in-place, even if it is .yml/.yaml
|
||||
-h, --help Show this help and exit
|
||||
|
||||
Notes:
|
||||
- Simple "key: value" YAML lines will be converted.
|
||||
- Already encrypted (!vault) entries are preserved.
|
||||
- Full vault-encrypted files (ANSIBLE_VAULT header) are detected.
|
||||
|
||||
EOF
|
||||
}
|
||||
|
||||
########################################
|
||||
# Hauptfunktion
|
||||
########################################
|
||||
vencr() {
|
||||
|
||||
unset IFS
|
||||
|
||||
# --- Help Flag ---
|
||||
if [[ "${1:-}" == "-h" || "${1:-}" == "--help" ]]; then
|
||||
show_help
|
||||
exit 0
|
||||
fi
|
||||
|
||||
########################################
|
||||
# Optionen: Ausgabe-Datei und Vollverschluesselung fuer YAML-Dateien.
|
||||
########################################
|
||||
local out_file=""
|
||||
local force_full_file=0
|
||||
while [[ -n "${1:-}" && "${1:-}" == -* ]]; do
|
||||
case "$1" in
|
||||
-o)
|
||||
if [[ -z "${2:-}" ]]; then
|
||||
echo "Error: -o requires a file name." >&2
|
||||
return 1
|
||||
fi
|
||||
out_file="$2"
|
||||
shift 2
|
||||
;;
|
||||
--full-file)
|
||||
force_full_file=1
|
||||
shift
|
||||
;;
|
||||
-h|--help)
|
||||
show_help
|
||||
exit 0
|
||||
;;
|
||||
--)
|
||||
shift
|
||||
break
|
||||
;;
|
||||
*)
|
||||
break
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
########################################
|
||||
# --- 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 nur fuer typische YAML-Dateien
|
||||
# (damit z.B. README.md als normale Datei komplett verschluesselt wird).
|
||||
if [[ $force_full_file -eq 0 ]] && [[ "$f" =~ \.(yml|yaml)$ ]] && 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"
|
||||
)
|
||||
|
||||
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 "$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
|
||||
echo "Hallo"
|
||||
printf '%s' "$str" | ansible-vault encrypt_string --stdin-name "$name"
|
||||
|
||||
}
|
||||
|
||||
########################################
|
||||
# Script starten
|
||||
########################################
|
||||
vencr "$@"
|
||||
Reference in New Issue
Block a user