CMD Master
Voltar ao blog
•Atualizado•Arnošt Havelka

Como escrever um script de backup Bash mais seguro com tar

Crie um script de backup Bash que valide a origem, evite sobrescritas silenciosas, remova arquivos parciais e confira o arquivo tar.

Iniciar lição interativa
Como escrever um script de backup Bash mais seguro com tar

Um script de backup Bash útil deve rejeitar uma origem inexistente, manter o destino fora dessa origem, evitar a sobrescrita silenciosa de um arquivo anterior, remover a saída parcial após uma falha e inspecionar o arquivo antes de informar sucesso. O exemplo abaixo cria um arquivo tar compactado com essas proteções. É um script de aprendizagem, não um sistema de backup completo. A lição de scripts Bash permite praticar como essas partes se encaixam.

Comece com caminhos explícitos para origem e destino

Salve o conteúdo abaixo como 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"

O primeiro argumento seleciona o diretório de origem, e o segundo define onde os arquivos serão armazenados. Sem argumentos, o script usa $HOME/data e $HOME/backups. Mantenha o diretório de backup fora do diretório de origem para que o script não tente arquivar a própria saída.

Entenda as verificações de segurança

set -euo pipefail faz essa sequência simples parar diante de uma falha de comando não tratada, de uma variável não definida ou de um comando com falha dentro de um pipeline. É uma proteção, não um substituto para o tratamento explícito dos casos de falha esperados.

O teste de diretório interrompe a execução antes de tar quando a origem não existe. O carimbo de data e hora evita que execuções normais reutilizem um nome fixo, enquanto a verificação explícita de existência rejeita uma colisão acidental no mesmo segundo.

Primeiro, o script grava em um caminho .partial. A armadilha EXIT remove esse arquivo parcial se tar, a inspeção do arquivo ou outro comando falhar. Somente um arquivo que pode ser lido com sucesso é movido para o nome final; depois disso, a armadilha é desativada.

Por que tar usa -C

Este comando cria um arquivo compactado com gzip:

tar -czf "$partial" -C "$source_parent" "$source_name"

As opções significam criar (c), compactar com gzip (z) e gravar no arquivo indicado em seguida (f). -C muda o diretório durante a operação, permitindo armazenar o nome e o conteúdo do diretório de origem em vez de um caminho absoluto.

Listar o conteúdo verifica se tar consegue ler a estrutura do arquivo:

tar -tzf "$archive"

Essa é uma verificação útil, mas não comprova que todos os arquivos estão atuais nem que uma restauração atenderá às suas necessidades.

Execute e teste o script

Confira a sintaxe antes da primeira execução:

bash -n backup.sh
bash backup.sh "$HOME/data" "$HOME/backups"

Depois, faça um teste de restauração em um diretório temporário:

restore_dir=$(mktemp -d)
tar -xzf "$HOME/backups/data-YYYYMMDD-HHMMSS.tar.gz" -C "$restore_dir"
find "$restore_dir" -type f

Substitua o nome de exemplo pelo arquivo que o script informou. Inspecione alguns arquivos restaurados representativos e remova o diretório temporário quando não precisar mais dele.

O que um backup real ainda precisa

Um arquivo local pode ser perdido junto com o mesmo disco que guarda a origem. Um plano de backup para produção também precisa de um destino independente, regras de retenção e exclusão, monitoramento, credenciais protegidas, espaço livre suficiente e testes regulares de restauração. Decida também como lidar com alterações simultâneas nos arquivos; tar sozinho não cria um backup consistente de um banco de dados em uso.

Leia como executar seu primeiro script Bash se o shebang ou as permissões ainda forem desconhecidos e use a lição de tar para praticar a criação de arquivos. O GNU documenta criação, compactação, sobrescrita e verificação no manual do tar.

Referências

Estes links de documentação trazem detalhes confiáveis sobre os comandos usados neste artigo.

A seguir

Orientação Bash: CD Loop

Pratique a movimentação dos diretórios filho e pai até que as mudanças de caminho pareçam automáticas.