Ein sichereres Bash-Backup-Skript mit tar schreiben
Erstelle ein Bash-Backup, das die Quelle prüft, Überschreiben verhindert, Teilarchive entfernt und die tar-Datei kontrolliert.
Interaktive Lektion startenEin brauchbares Backup-Skript muss eine fehlende Quelle ablehnen, das Ziel außerhalb der Quelle halten, vorhandene Archive nicht still überschreiben, Teildateien nach Fehlern entfernen und das Archiv vor der Erfolgsmeldung prüfen. Das folgende Lernbeispiel erstellt ein komprimiertes tar-Archiv mit diesen Schutzmaßnahmen. Es ersetzt kein vollständiges Backup-System. Die Bash-Skriptlektion erklärt das Zusammenspiel der Teile.
Quelle und Ziel ausdrücklich festlegen
Speichere den folgenden Inhalt als backup.sh:
#!/usr/bin/env bash
set -euo pipefail
source_dir="${1:-$HOME/data}"
backup_dir="${2:-$HOME/backups}"
if [[ ! -d "$source_dir" ]]; then
printf 'Source directory not found: %s\n' "$source_dir" >&2
exit 1
fi
mkdir -p "$backup_dir"
source_parent=$(dirname "$source_dir")
source_name=$(basename "$source_dir")
timestamp=$(date '+%Y%m%d-%H%M%S')
archive="$backup_dir/${source_name}-${timestamp}.tar.gz"
partial="$archive.partial"
if [[ -e "$archive" || -e "$partial" ]]; then
printf 'Backup destination already exists: %s\n' "$archive" >&2
exit 1
fi
trap 'rm -f "$partial"' EXIT
tar -czf "$partial" -C "$source_parent" "$source_name"
tar -tzf "$partial" >/dev/null
mv "$partial" "$archive"
trap - EXIT
printf 'Backup created: %s\n' "$archive"
Das erste Argument wählt die Quelle, das zweite das Archivverzeichnis. Ohne Argumente gelten $HOME/data und $HOME/backups. Das Ziel muss außerhalb der Quelle liegen, damit das Skript nicht seine eigene Ausgabe archiviert.
Schutzmaßnahmen verstehen
set -euo pipefail beendet diese einfache Folge bei unbehandelten Fehlern, nicht gesetzten Variablen und fehlgeschlagenen Pipeline-Befehlen. Erwartete Fehler müssen trotzdem ausdrücklich geprüft werden.
Die Verzeichnisprüfung stoppt vor tar, wenn die Quelle fehlt. Ein Zeitstempel verhindert normale Namenswiederholungen; die Existenzprüfung lehnt auch eine Kollision in derselben Sekunde ab. Zuerst entsteht eine .partial-Datei. Der EXIT-Trap entfernt sie bei Fehlern. Erst nach erfolgreicher Lesbarkeitsprüfung wird sie zum endgültigen Archiv verschoben.
Warum tar -C verwendet
tar -czf "$partial" -C "$source_parent" "$source_name"
Die Optionen stehen für Erstellen (c), gzip-Komprimierung (z) und Ausgabedatei (f). -C wechselt für den Archivvorgang das Verzeichnis, sodass kein absoluter Quellpfad gespeichert wird.
Die Struktur lässt sich auflisten:
tar -tzf "$archive"
Das beweist Lesbarkeit, aber weder Aktualität aller Dateien noch einen erfolgreichen Wiederherstellungsprozess.
Skript ausführen und Wiederherstellung testen
bash -n backup.sh
bash backup.sh "$HOME/data" "$HOME/backups"
Teste anschließend in einem temporären Verzeichnis:
restore_dir=$(mktemp -d)
tar -xzf "$HOME/backups/data-YYYYMMDD-HHMMSS.tar.gz" -C "$restore_dir"
find "$restore_dir" -type f
Ersetze den Beispielnamen durch das ausgegebene Archiv. Ein echtes Konzept benötigt zusätzlich ein unabhängiges Ziel, Aufbewahrungsregeln, Monitoring, geschützte Zugangsdaten und regelmäßige Restore-Tests.
Bei Unsicherheit zu Start und Rechten hilft der Einstieg in Bash-Skripte; Archivgrundlagen bietet die tar-Lektion. Vollständige Regeln stehen im GNU-tar-Handbuch.
Quellen
Diese Dokumentationslinks liefern verlässliche Details zu den in diesem Artikel verwendeten Befehlen.
Nächstes
Üben Sie die Bewegung des untergeordneten und übergeordneten Verzeichnisses, bis sich Pfadänderungen automatisch anfühlen.