Jak napsat bezpečnější zálohovací skript v Bashi pomocí tar
Sestavte Bash skript, který ověří zdroj, nepřepíše zálohu, odstraní neúplný archiv a před úspěchem zkontroluje soubor tar.
Spustit interaktivní lekciUžitečný zálohovací skript v Bashi by měl odmítnout chybějící zdroj, udržet cílovou cestu mimo tento zdroj, nepřepisovat bez upozornění starší archiv, po selhání odstranit neúplný výstup a před ohlášením úspěchu archiv prohlédnout. Následující příklad vytváří komprimovaný archiv tar s těmito ochrannými prvky. Je to výukový skript, nikoli kompletní zálohovací systém. V lekci skriptování v Bashi si můžete procvičit, jak jednotlivé části spolupracují.
Začněte jednoznačnými cestami zdroje a cíle
Uložte následující obsah jako 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"
První argument vybírá zdrojový adresář a druhý určuje, kam se mají archivy ukládat. Bez argumentů skript použije $HOME/data a $HOME/backups. Zálohovací adresář ponechte mimo zdrojový adresář, aby se skript nepokoušel archivovat vlastní výstup.
Pochopte bezpečnostní kontroly
Nastavení set -euo pipefail způsobí, že se tato jednoduchá posloupnost zastaví při neošetřeném selhání příkazu, nenastavené proměnné nebo neúspěšném příkazu v rouře. Je to ochranný prvek, ne náhrada za explicitní kontrolu očekávaných chybových stavů.
Test adresáře zastaví skript před příkazem tar, pokud zdroj chybí. Časová značka zabraňuje běžným spuštěním znovu používat jeden pevný název a explicitní kontrola existence odmítne náhodnou kolizi ve stejné sekundě.
Skript nejprve zapisuje do cesty s koncovkou .partial. Jeho obsluha EXIT tento neúplný soubor odstraní, pokud selže tar, kontrola archivu nebo jiný příkaz. Teprve úspěšně čitelný archiv se přesune na konečný název a následně se obsluha vypne.
Proč tar používá -C
Tento příkaz vytvoří archiv komprimovaný pomocí gzip:
tar -czf "$partial" -C "$source_parent" "$source_name"
Přepínače znamenají vytvořit (c), komprimovat pomocí gzip (z) a zapsat do následujícího souboru (f). -C pro operaci archivace změní adresář, takže se uloží název zdrojového adresáře a jeho obsah místo absolutní cesty.
Výpis archivu ověří, že tar dokáže přečíst jeho strukturu:
tar -tzf "$archive"
Jde o užitečné ověření, ale nedokazuje, že je každý soubor aktuální ani že obnova splní vaše požadavky.
Spusťte a otestujte skript
Před prvním spuštěním zkontrolujte syntaxi:
bash -n backup.sh
bash backup.sh "$HOME/data" "$HOME/backups"
Poté proveďte test obnovy v dočasném adresáři:
restore_dir=$(mktemp -d)
tar -xzf "$HOME/backups/data-YYYYMMDD-HHMMSS.tar.gz" -C "$restore_dir"
find "$restore_dir" -type f
Ukázkový název archivu nahraďte názvem, který skript vypsal. Zkontrolujte několik typických obnovených souborů a dočasný adresář odstraňte, až ho nebudete potřebovat.
Co skutečné zálohování ještě potřebuje
Místní archiv může být ztracen společně se stejným diskem jako jeho zdroj. Produkční zálohovací plán potřebuje také nezávislý cíl, pravidla uchovávání a mazání, sledování stavu, chráněné přihlašovací údaje, dostatek volného místa a pravidelné testy obnovy. Rozhodněte také, jak se zpracují soubory měněné souběžně; samotný tar nedokáže vytvořit aplikačně konzistentní zálohu databáze.
Pokud vám nejsou známé řádek shebang nebo oprávnění, přečtěte si jak spustit první Bash skript. Pro cílené procvičení archivů použijte lekci tar. Vytváření archivů, kompresi, chování při přepisování a ověřování popisuje GNU v manuálu tar.
Reference
Tyto odkazy na dokumentaci poskytují spolehlivé informace o příkazech použitých v tomto článku.
Další
Cvičte přesun podřízeného a nadřazeného adresáře, dokud se změny cesty nebudou cítit automaticky.