rokom-terminal-backupscript-simple3

Ultimatives Backup-Script

Thema: Einfaches voll-automatisches Backup, egal welches USB-Medium

Zielgruppe: CLI-Nutzer auf unixoiden Systemen

Motivation: In erster Linie ein voll-automatisches und inkrementelles Backup.

Inhaltsverzeichnis

In einem Satz

Irgendein USB-Gerät in den PC stecken, 10 Sekunden warten und Script starten, fertig.

Was diese Script kann

Natürlich in erster Linie ein automatisches und inkrementelles Backup erstellen. Ansonsten ist es fast die eierlegende Wollmilchsau.

  • Lauffähig auf Linux, möglicherweise BSD und macOS
  • Das Backup-Medium wird automatisch gefunden
  • Das Backup-Medium wird mit „chown“ dem Benutzer zugeordnet
  • Die Variablen für Quell- und Zielverzeichnis werden automatisch erstellt
  • Eine mehrfache Rotation für differenzierte Log-Dateien je Backup-Medium
  • Eine saubere rsync-Sicherung
  • Mit „umount“ das Backup-Medium auswerfen
  • Dem Backup-Medium den Strom abschalten

Das Script

#!/bin/sh
# Script Name:  usb-backup.sh
# Beschreibung: Inkrementelles Backup 
# Aufruf:       usb-backup.sh
# Parameter:    keine
# Autor:        Frank Rosenberger - https://ro-kom.de
# Version:      0.2
# Datum:        2023-08-31 - 10:59
# Lizenz:       GPL2 - https://www.gnu.org/licenses/old-licenses/gpl-2.0.html

### BESCHREIBUNG DETAILLIERT ###
# Findet automatisch das Backup-Medium
# Setzt automatisch alle Variablen, auch für differenzierte Log-Dateien 
# Kann mehrfach hintereinander mit verschieden Geräten genutzt werden

# ZIELVERZEICHNIS FINDEN
# Prüft, ob ein USB-Gerät eingehängt ist, und setzt den entsprechenden Pfad.
# Falls kein geeigneter Pfad gefunden wird, erzeugt das eine Meldung und das Skript wird beendet.
if [ -d "/run/media/$USER" ]; then
    path="/run/media/$USER/"
elif [ -d "/media/$USER" ]; then
    path="/media/$USER/"
else
    echo "USB-Geräte-Pfad nicht gefunden."
    exit 1
fi

# VARIABLEN
# Ermittelt den ersten Eintrag im angegebenen Pfad, um das Zielgerät zu identifizieren.
find=$(ls -A "$path" | head -n 1)
disk="$path$find"

# Das vorhandene Gerät aneignen
group=$(id -gn $USER)
echo "$group"
chown -R $group:$USER $path/*

# Hier werden die Pfade für Log-Dateien und andere Verzeichnisse gesetzt.
rl="$HOME/Logs"
file="rsync-$find"
block_device=""

# Hier sind Quell- und Zielverzeichnisse hinterlegt.
source1=$HOME
target1=$disk

# Überprüfen, ob das Zielverzeichnis eingehängt ist.
# Wenn nicht, wird eine Fehlermeldung ausgegeben und das Skript beendet.
if ! grep -qs "$disk" /proc/mounts; then
    echo "Zielverzeichnis $disk ist nicht eingehängt."
    exit 1
fi

# LOG
# Funktion zur Log-Rotation
rotate_logs() {
    local prefix="$1"
    local max_count=7
    
    # Verschiebt bestehende Log-Dateien, um Platz für neue zu machen.
    for i in $(seq $((max_count - 1)) -1 1); do
        if [ -f "$rl/$prefix-$i.log" ]; then
            mv "$rl/$prefix-$i.log" "$rl/$prefix-$((i+1)).log"
        fi
    done
    
    # Verschiebt die aktuelle Log-Datei, falls vorhanden.
    if [ -f "$rl/$prefix.log" ]; then
        mv "$rl/$prefix.log" "$rl/$prefix-1.log"
    fi
}

# Log-Rotation für rsync-Logs des Benutzers
rotate_logs "$file-$USER" # log-file=$rl/$file-$USER.log

# RSYNC
# Führe rsync-Befehle aus, um Daten zu synchronisieren.
# Die rsync-Befehle synchronisieren Daten von den Quellpfaden zu den Zielpfaden.
rsync -avz --delete --human-readable --size-only --progress --log-file=$rl/$file-$USER.log $source1 $target1

# SHUTDOWN
# Ermittle den Blockgerätedateipfad des gefundenen Geräts für das Herunterfahren.
block_device=$(df -P "$disk" | awk 'NR==2 {print $1}')
device_name=$(udevadm info -q path -n "$block_device" | awk -F'/' '{print $NF}')

# Warte 5 Sekunden, bevor das System heruntergefahren wird.
sleep 5s

# Unmounte das gefundene Gerät.
umount "$disk"

# Warte erneut 5 Sekunden.
sleep 5s

# Schalte das Gerät aus.
udisksctl power-off -b "$block_device"


: '
Platz
für Ihre eigenen
Kommentare.

'

Erweiterungen

Personalisierte Erweiterung wären vorstellbar:

  • Wenn das eigene System kein automatisches „mount“ für USB-Geräte besitzt, dieses mit einzubauen
  • Diverse Dialoge für zusätzliches formatieren oder komplett neues Dateisystem anlegen
  • Diverse Dialoge für Benennungen von Geräten, Objekten, Quellen und Zielen
  • Noch mehr, dann siehe den nächsten Beitrag

Ihr Kom­men­tar [Pos1] Sei­ten­an­fang