Initial commit
This commit is contained in:
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
*.html
|
||||||
|
*.pdf
|
||||||
|
*.json
|
||||||
30
README.md
Normal file
30
README.md
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
# Bitwarden Passwörter zu HTML
|
||||||
|
|
||||||
|
Dieses Skript wandelt eine exportierte `.json`-Datei aus Bitwarden in eine besser lesbare HTML-Datei um. **Achtung:** In der HTML-Datei sind alle Passwörter **im Klartext** zu sehen. Das Skript ist ausschließlich für den internen Gebrauch gedacht, z. B. zur Erstellung einer gedruckten Kopie für die Aufbewahrung in einem Safe.
|
||||||
|
|
||||||
|
## Funktionsweise
|
||||||
|
|
||||||
|
1. **Export der Bitwarden-Daten:**
|
||||||
|
- In Bitwarden auf **Datei -> Tresor exportieren** klicken.
|
||||||
|
- Den Tresor auswählen.
|
||||||
|
- Als Dateiformat `.json` wählen.
|
||||||
|
|
||||||
|
<img src="https://git.gofel.net/Thorsten/shell_bitwarden_json_to_html/raw/branch/master/images/image1.png" alt="Export" width="450">
|
||||||
|
|
||||||
|
2. **Datei vorbereiten:**
|
||||||
|
- Die exportierte `.json`-Datei in denselben Ordner wie das Skript verschieben.
|
||||||
|
|
||||||
|
3. **Skript ausführbar machen:**
|
||||||
|
```bash
|
||||||
|
chmod +x bitwarden_convert_to_html.sh
|
||||||
|
```
|
||||||
|
4. **Skript ausführen:**
|
||||||
|
```bash
|
||||||
|
./bitwarden_convert_to_html.sh
|
||||||
|
```
|
||||||
|
Eine `.html`-Datei wird im selben Ordner erstellt, in dem sich das Skript befindet.
|
||||||
|
|
||||||
|
<img src="https://git.gofel.net/Thorsten/shell_bitwarden_json_to_html/raw/branch/master/images/image2.png" alt="Export" width="450">
|
||||||
|
|
||||||
|
## Zusätzliche PDF-Unterstützung
|
||||||
|
Das Skript überprüft nach der Erstellung der `.html`-Datei, ob das Tool `wkhtmltopdf` auf Ihrem System installiert ist. Falls `wkhtmltopdf` verfügbar ist, wird automatisch auch eine `.pdf`-Datei erzeugt.
|
||||||
150
bitwarden_convert_to_html.sh
Executable file
150
bitwarden_convert_to_html.sh
Executable file
@@ -0,0 +1,150 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Pfad zum Verzeichnis mit den JSON-Dateien (aktuelles Verzeichnis)
|
||||||
|
json_dir="$(pwd)"
|
||||||
|
|
||||||
|
# Überprüfen, ob das Verzeichnis existiert
|
||||||
|
if [ ! -d "$json_dir" ]; then
|
||||||
|
echo "Verzeichnis nicht gefunden!"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# CSS-Variablen für Stile
|
||||||
|
# Hintergrundfarbe
|
||||||
|
background_color="#ffffff" # Standard-Hintergrundfarbe (Weiß)
|
||||||
|
|
||||||
|
# h1
|
||||||
|
header1_font_size="24px"
|
||||||
|
header1_font_size_print="48px"
|
||||||
|
header1_font_weight="bold"
|
||||||
|
header1_font_family="Arial, sans-serif"
|
||||||
|
header1_color="#000000"
|
||||||
|
|
||||||
|
# h2
|
||||||
|
header2_font_size="20px"
|
||||||
|
header2_font_size_print="40px"
|
||||||
|
header2_font_weight="bold"
|
||||||
|
header2_font_family="Arial, sans-serif"
|
||||||
|
header2_color="#000000"
|
||||||
|
|
||||||
|
# strong
|
||||||
|
strong_font_size="16px"
|
||||||
|
strong_font_size_print="32px"
|
||||||
|
strong_font_weight="bold"
|
||||||
|
strong_font_family="Arial, sans-serif"
|
||||||
|
strong_color="#000000"
|
||||||
|
|
||||||
|
# Normaler Text
|
||||||
|
normal_font_size="14px"
|
||||||
|
normal_font_size_print="28px"
|
||||||
|
normal_font_weight="normal"
|
||||||
|
normal_font_family="Arial, sans-serif"
|
||||||
|
normal_color="#555555"
|
||||||
|
|
||||||
|
# Margin-Left und Margin-Right für alle Elemente
|
||||||
|
margin_left="10px"
|
||||||
|
margin_right="10px" # Hinzugefügt für Konsistenz auf der Webansicht
|
||||||
|
margin_left_print="30px"
|
||||||
|
margin_right_print="30px"
|
||||||
|
|
||||||
|
# Abstand der Trennstriche zum Text
|
||||||
|
hr_margin="10px 0" # Beispiel: 10px Abstand oben und unten
|
||||||
|
hr_margin_print="20px 0" # Erhöhter Abstand für die Druckansicht
|
||||||
|
|
||||||
|
# Durchlaufe alle JSON-Dateien im Verzeichnis
|
||||||
|
for json_file in "$json_dir"/*.json; do
|
||||||
|
# Überprüfen, ob die Datei existiert
|
||||||
|
if [ ! -f "$json_file" ]; then
|
||||||
|
echo "Keine JSON-Dateien gefunden!"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Ausgabe-HTML-Datei basierend auf dem Namen der JSON-Datei
|
||||||
|
output_file="${json_file%.json}.html"
|
||||||
|
|
||||||
|
# HTML-Kopfzeile mit CSS-Styles schreiben
|
||||||
|
echo "<html>" > "$output_file"
|
||||||
|
echo "<head><title>Passwort Manager Daten</title>" >> "$output_file"
|
||||||
|
echo "<meta charset=\"UTF-8\">" >> "$output_file"
|
||||||
|
echo "<style>" >> "$output_file"
|
||||||
|
echo "/* CSS-Reset */" >> "$output_file"
|
||||||
|
echo "* { margin: 0; padding: 0; box-sizing: border-box; }" >> "$output_file"
|
||||||
|
echo "body { font-family: $normal_font_family; color: $normal_color; margin-left: $margin_left; margin-right: $margin_right; background-color: $background_color; }" >> "$output_file"
|
||||||
|
echo "h1 { font-size: $header1_font_size; font-weight: $header1_font_weight; font-family: $header1_font_family; color: $header1_color; margin-bottom: 10px; margin-left: $margin_left; }" >> "$output_file"
|
||||||
|
echo "h2 { font-size: $header2_font_size; font-weight: $header2_font_weight; font-family: $header2_font_family; color: $header2_color; margin-bottom: 8px; margin-left: $margin_left; }" >> "$output_file"
|
||||||
|
echo ".strong { font-size: $strong_font_size; font-weight: $strong_font_weight; font-family: $strong_font_family; color: $strong_color; }" >> "$output_file"
|
||||||
|
echo "p { font-size: $normal_font_size; font-weight: $normal_font_weight; color: $normal_color; margin-bottom: 5px; margin-left: $margin_left; }" >> "$output_file"
|
||||||
|
echo "p.uri { margin-left: $margin_left_subcategory; }" >> "$output_file"
|
||||||
|
echo "p.fields { margin-left: $margin_left_subcategory; }" >> "$output_file"
|
||||||
|
echo "div { margin-bottom: 20px; margin-left: $margin_left; margin-right: $margin_right; }" >> "$output_file"
|
||||||
|
echo "hr { margin: $hr_margin; height: 2px; border: none; background-color: $normal_color; }" >> "$output_file"
|
||||||
|
echo "@media print {" >> "$output_file"
|
||||||
|
echo " body { font-size: $normal_font_size_print; margin-left: $margin_left_print; margin-right: $margin_right_print; }" >> "$output_file"
|
||||||
|
echo " h1 { font-size: $header1_font_size_print; }" >> "$output_file"
|
||||||
|
echo " h2 { font-size: $header2_font_size_print; }" >> "$output_file"
|
||||||
|
echo " .strong { font-size: $strong_font_size_print; }" >> "$output_file"
|
||||||
|
echo " p { font-size: $normal_font_size_print; }" >> "$output_file"
|
||||||
|
echo " div { margin-left: $margin_left_print; margin-right: $margin_right_print; }" >> "$output_file"
|
||||||
|
echo " hr { margin: $hr_margin_print; }" >> "$output_file" # Angepasste Margen für Trennstriche im Druck
|
||||||
|
echo "}" >> "$output_file"
|
||||||
|
echo "</style>" >> "$output_file"
|
||||||
|
echo "</head>" >> "$output_file"
|
||||||
|
echo "<body>" >> "$output_file"
|
||||||
|
echo "<h1>Passwort Manager Daten</h1>" >> "$output_file"
|
||||||
|
|
||||||
|
# Sammlung-Namen in eine Variable laden
|
||||||
|
collections=$(jq -r '.collections | map({(.id): .name}) | add' "$json_file")
|
||||||
|
|
||||||
|
# Items in HTML umwandeln
|
||||||
|
jq -r --argjson collections "$collections" '
|
||||||
|
.items[] |
|
||||||
|
"<hr/><div><h2>\(.name)</h2>" +
|
||||||
|
(if .login.username != null then "<p><span class=\"strong\">Nutzername:</span> \(.login.username)</p>" else "" end) +
|
||||||
|
(if .login.password != null then "<p><span class=\"strong\">Passwort:</span> \(.login.password)</p>" else "" end) +
|
||||||
|
(if .notes != null then "<p><span class=\"strong\">Notizen:</span> \(.notes)</p>" else "" end) +
|
||||||
|
(if (.login.uris | length) > 0 then
|
||||||
|
"<p><span class=\"strong\">URIs:</span></p>" +
|
||||||
|
(.login.uris | to_entries | map("<p class=\"uri\"><span class=\"strong\">URI \(.key + 1):</span> <a href=\"" + .value.uri + "\">" + .value.uri + "</a></p>") | join(""))
|
||||||
|
else "" end) +
|
||||||
|
(if (.fields | length) > 0 then "<p><span class=\"strong\">Benutzerdefinierte Felder:</span></p>" + (.fields | map("<p class=\"fields\"><span class=\"strong\">\(.name):</span> \(.value)</p>") | join("")) else "" end) +
|
||||||
|
(if (.collectionIds | length) > 0 then
|
||||||
|
"<p><span class=\"strong\">Sammlungen:</span></p>" +
|
||||||
|
(.collectionIds | map($collections[.] // "Unbekannt") | sort_by(length) | to_entries | map(
|
||||||
|
"<p class=\"fields\"><span class=\"strong\">Sammlung \(.key + 1):</span> " +
|
||||||
|
.value +
|
||||||
|
"</p>"
|
||||||
|
) | join(""))
|
||||||
|
else "" end) +
|
||||||
|
"</div>"
|
||||||
|
' "$json_file" >> "$output_file"
|
||||||
|
|
||||||
|
# Überprüfen, ob jq einen Fehler hatte
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo "Fehler beim Parsen der JSON-Datei: $json_file"
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
|
||||||
|
# HTML-Fußzeile schreiben
|
||||||
|
echo "</body>" >> "$output_file"
|
||||||
|
echo "</html>" >> "$output_file"
|
||||||
|
|
||||||
|
echo "HTML-Datei wurde erstellt: $output_file"
|
||||||
|
|
||||||
|
# PDF-Datei basierend auf der HTML-Datei erstellen
|
||||||
|
pdf_file="${output_file%.html}.pdf"
|
||||||
|
|
||||||
|
# Überprüfen, ob wkhtmltopdf installiert ist
|
||||||
|
if ! command -v wkhtmltopdf &> /dev/null; then
|
||||||
|
echo "PDF Erzeugung nicht möglich. Installieren sie wkhtmltopdf wenn sie Ausgabe in PDF Form benötigen."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
wkhtmltopdf --page-size A4 --dpi 600 "$output_file" "$pdf_file"
|
||||||
|
|
||||||
|
# Überprüfen, ob wkhtmltopdf erfolgreich war
|
||||||
|
if [ $? -ne 0 ]; then
|
||||||
|
echo "Fehler beim Erstellen der PDF-Datei: $pdf_file"
|
||||||
|
else
|
||||||
|
echo "PDF-Datei wurde erstellt: $pdf_file"
|
||||||
|
fi
|
||||||
|
done
|
||||||
BIN
images/image_1.png
Normal file
BIN
images/image_1.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 37 KiB |
BIN
images/image_2.png
Normal file
BIN
images/image_2.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 46 KiB |
Reference in New Issue
Block a user