Zum Hauptinhalt springen Skip to page footer

Automatisiertes Backup mit Shell-Skript: Sichern, Komprimieren und Übertragen von Dateien und Datenbanken per SFTP

| Tutorial | Bash SSH Linux

Erfahren Sie, wie Sie Shell-Skripte verwenden, um mühsame Aufgaben zu automatisieren und Ihre Daten effektiv zu sichern. Dieser Artikel führt Sie durch alles von der Skriptvorbereitung bis zur Übertragung von Backups auf einen anderen Server. Entdecken Sie die Vielseitigkeit und Plattformunabhängigkeit von Shell-Skripten und optimieren Sie Ihren Workflow. Lesen Sie jetzt, um zu erfahren, wie Sie Zeit sparen und Ihre Daten schützen. 

Shell-Skript

Ein Shell-Skript ist eine Textdatei mit Befehlen, die von einer Shell interpretiert und ausgeführt werden. Shell-Skripte automatisieren Aufgaben und ermöglichen die Ausführung von Befehlen in einer bestimmten Reihenfolge. Sie können Variablen verwenden, Bedingungen testen, Schleifen durchlaufen und auf Benutzereingaben zugreifen. Shell-Skripte sind plattformunabhängig und können auf einer Vielzahl von Betriebssystemen verwendet werden, sofern ein geeigneter Shell-Interpreter verfügbar ist. 

Schritt 1: Vorbereitungen

tellen Sie sicher, dass Sie die folgenden Voraussetzungen erfüllen:

  • Linux-Betriebssystem mit den erforderlichen Programmen: tar, mysqldump, sftp
  • Zugriff auf die zu sichernden Dateien und Ordner
  • Zugriff auf die MySQL-Datenbank
  • Zugriff auf den anderen Server über SFTP

Schritt 2: Erstellen Sie ein neues Skript

Öffnen Sie einen Texteditor Ihrer Wahl und erstellen Sie eine neue Datei. Geben Sie dem Skript einen aussagekräftigen Namen, wie z.B. "backup_script.sh". Wir nutzen in diesem Beispiel den Editor nano.

sudo nano backup_script.sh

Schritt 3: Skript-Grundstruktur erstellen

Fügen Sie die folgenden Zeilen am Anfang des Skripts hinzu:

#!/bin/bash

# Verzeichnis und Dateien für das Backup
SOURCE_DIR="/pfad/zum/zu/sichernden/verzeichnis"
BACKUP_DIR="/pfad/zum/zielverzeichnis/für/das/backup"
BACKUP_FILE="backup_$(date +%Y-%m-%d).tar.gz"

# MySQL-Datenbankinformationen
DB_USER="benutzername"
DB_PASSWORD="passwort"
DB_NAME="datenbankname"

# SFTP-Serverinformationen
SFTP_USER="sftp_benutzername"
SFTP_HOST="sftp_server"
SFTP_REMOTE_DIR="/pfad/auf/dem/sftp_server"
SFTP_PASSWORD="sftp_password"

Die Zeile „#!/bin/bash“ wird Shebang-Zeile genannt und befindet sich normalerweise am Anfang von Shell-Skripten. Sie gibt an, welcher Interpreter für die Skriptausführung verwendet werden soll.

In diesem Fall ist der Interpreter „bash“, was für „Bourne Again Shell“ steht. Bash ist eine weit verbreitete Shell und wird standardmäßig auf den meisten Linux- und Unix-Systemen verwendet.

Die Shebang-Zeile ist wichtig, damit das Betriebssystem weiß, in welchem ​​Interpreter das Skript ausgeführt werden soll. Wenn das Skript ausgeführt wird, liest das Betriebssystem diese Zeile und verwendet den angegebenen Interpreter, um den Rest des Skripts zu interpretieren und auszuführen.

„#!/bin/bash“ ermöglicht die Interpretation von Skripten durch Bash, unabhängig vom auf dem System eingestellten Standard-Shell-Interpreter. 

Die Variablen sind selbsterklärend, lediglich die Variable BACKUP_FILE weist eine Besonderheit auf. Sie wird in dem gegebenen Beispiel mit dem Wert "backup_$(date +%Y-%m-%d).tar.gz" initialisiert.

Hierbei handelt es sich um eine sogenannte Shell-Expansion, bei der der Inhalt in den Anführungszeichen zur Laufzeit ausgewertet wird.

Der Inhalt der Variable besteht aus mehreren Teilen:

  1. "backup_": Dies ist ein statischer Text, der als Teil des Dateinamens verwendet wird.
  2. $(date +%Y-%m-%d): Dies ist ein Befehl innerhalb der Shell-Expansion, der das aktuelle Datum in dem angegebenen Format zurückgibt. Das date-Kommando wird mit der Option +%Y-%m-%d aufgerufen, um das Datum im Format "Jahr-Monat-Tag" zu erhalten. Das Ergebnis dieses Befehls wird in den Dateinamen eingefügt.
  3. ".tar.gz": Dies ist wiederum ein statischer Text, der als Dateiendung verwendet wird.

Die Shell-Expansion $(...) ermöglicht es, den Befehl date +%Y-%m-%d auszuführen und das Ergebnis als Teil des Dateinamens in der Variable BACKUP_FILE zu speichern. Auf diese Weise wird ein dynamischer Dateiname erstellt, der das aktuelle Datum enthält.

Als Ergebnis wird der Wert der Variable BACKUP_FILE beispielsweise so aussehen: backup_2023-05-24.tar.gz, wobei das aktuelle Datum entsprechend eingefügt wird.

Passen Sie die Pfade und Variablen entsprechend Ihren Anforderungen an.

Schritt 4: MySQL-/MariaDB-Datenbank sichern

Fügen Sie die folgenden Zeilen zum Skript hinzu, um die MySQL-Datenbank zu sichern:

# MySQL-Datenbank sichern
mysqldump -u "$DB_USER" -p"$DB_PASSWORD" "$DB_NAME" > "$BACKUP_DIR/database_backup.sql"

Der Befehl mysqldump -u "$DB_USER" -p"$DB_PASSWORD" "$DB_NAME" > “$BACKUP_DIR/database_backup.sql” wird verwendet, um eine Sicherung (Dump) einer MySQL-Datenbank zu erstellen und sie in einer SQL-Datei zu speichern.

Hier ist eine Erklärung der einzelnen Bestandteile des Befehls:

  • mysqldump: Dieser Befehl wird verwendet, um eine Sicherung einer MySQL-Datenbank zu erstellen. Es ermöglicht das Extrahieren der Datenbankstruktur und der Daten in SQL-Format.
  • -u “$DB_USER”: Diese Option gibt den Benutzernamen ($DB_USER) an, mit dem eine Verbindung zur Datenbank hergestellt werden soll. Der Wert von $DB_USER wird als Platzhalter für den tatsächlichen Benutzernamen verwendet.
  • -p"$DB_PASSWORD": Diese Option gibt das Passwort ($DB_PASSWORD) für den Datenbankbenutzer an. Das $DB_PASSWORD wird als Platzhalter für das tatsächliche Passwort verwendet. Beachten Sie, dass es keinen Leerraum zwischen `-p` und dem Passwort geben darf.
  • "$DB_NAME": Dies ist der Name der Datenbank, von der eine Sicherung erstellt werden soll. Der Wert von $DB_NAME wird als Platzhalter für den tatsächlichen Datenbanknamen verwendet.
  • > “$BACKUP_DIR/database_backup.sql”: Der Ausgabe-Redirector > leitet die Ausgabe des`mysqldump-Befehls in eine Datei um. Der Dateiname, in den die Ausgabe geschrieben wird, ist "$BACKUP_DIR/database_backup.sql". Der Wert von $BACKUP_DIR wird als Platzhalter für das tatsächliche Backup-Verzeichnis verwendet.

Zusammenfassend erstellt der Befehl mysqldump -u "$DB_USER" -p"$DB_PASSWORD" "$DB_NAME" > “$BACKUP_DIR/database_backup.sql” eine Sicherung der angegebenen MySQL-Datenbank und speichert diese in einer SQL-Datei im angegebenen Backup-Verzeichnis.

Schritt 5: Dateien und Ordner sichern

Fügen Sie die folgenden Zeilen zum Skript hinzu, um das Verzeichnis inklusive Dateien und Unterordner zu komprimieren:

# Verzeichnis und Dateien komprimieren
tar -zcvf "$BACKUP_DIR/$BACKUP_FILE" "$SOURCE_DIR" "$BACKUP_DIR/database_backup.sql"

Der Befehl tar -zcvf "$BACKUP_DIR/$BACKUP_FILE" “$SOURCE_DIR” "$BACKUP_DIR/database_backup.sql" erstellt ein komprimiertes Archiv (Tarball) und fügt mehrere Dateien hinzu:

Hier ist eine Erklärung der einzelnen Bestandteile des Befehls:

  • tar: Dieser Befehl steht für "tape archive" und wird verwendet, um Archivdateien zu erstellen oder zu extrahieren. In diesem Fall erstellt der Befehl ein Archiv.
  • -z: Dies ist eine Option für den Befehl tar und gibt an, dass das Archiv komprimiert werden soll. Das z steht für die Komprimierung mit gzip.
  • -c: Diese Option gibt an, dass ein neues Archiv erstellt werden soll.
  • -v: Diese Option steht für "verbose" und gibt detaillierte Ausgaben während der Archivierung aus. Dadurch werden die Dateinamen angezeigt, während sie dem Archiv hinzugefügt werden.
  • -f “$BACKUP_DIR/$BACKUP_FILE”: Diese Option steht für "file" und gibt den Dateinamen an, unter dem das Archiv gespeichert wird. Der Dateiname wird durch die Variablen $BACKUP_DIR (das Backup-Verzeichnis) und $BACKUP_FILE (der Name des Backup-Dateinamens) gebildet. Die Verwendung von Anführungszeichen um “$BACKUP_DIR/$BACKUP_FILE” stellt sicher, dass der gesamte Dateipfad als eine zusammenhängende Einheit interpretiert wird.
  • “$SOURCE_DIR”: Dies ist das Quellverzeichnis, das dem Archiv hinzugefügt werden soll. Es wird ebenfalls in Anführungszeichen gesetzt, um sicherzustellen, dass der gesamte Pfad als eine zusammenhängende Einheit behandelt wird.
  • "$BACKUP_DIR/database_backup.sql": Dies ist der Dateiname einer weiteren Datei, die dem Archiv hinzugefügt wird. In diesem Fall wird die Datei database_backup.sql im Backup-Verzeichnis ($BACKUP_DIR) angegeben.

Zusammenfassend erstellt der Befehl tar -zcvf "$BACKUP_DIR/$BACKUP_FILE" “$SOURCE_DIR” "$BACKUP_DIR/database_backup.sql" ein komprimiertes Archiv, das den Inhalt des angegebenen Quellverzeichnisses und die Datei database_backup.sql im Backup-Verzeichnis ($BACKUP_DIR) enthält, und speichert es im angegebenen Backup-Verzeichnis mit dem angegebenen Dateinamen.

Schritt 6: SQL-Datei löschen

Die SQL-Datei $BACKUP_DIR/database_backup.sql wurde dem Archiv hinzugefügt und wird jetzt nicht mehr benötigt und mit dem folgenden Befehl gelöscht:

# SQL-Datei löschen
rm "$BACKUP_DIR/database_backup.sql"

Schritt 7: Backupdatei auf einen anderen Server übertragen

Fügen Sie die folgenden Zeilen zum Skript hinzu, um die Backupdateien per SFTP auf den anderen Server zu übertragen:

# Backupdateien per SFTP übertragen
expect <<EOF
spawn sftp -P2222 $SFTP_USER@$SFTP_HOST
expect "password:"
send "$SFTP_PASSWORD\r"
expect "sftp>"
send "cd $SFTP_REMOTE_DIR\r"
expect "sftp>"
send "put $BACKUP_DIR/$BACKUP_FILE\r"
expect "sftp>"
send "bye\r"
expect eof
EOF

Der Code verwendet das Programm expect, um eine automatisierte Interaktion mit dem SFTP-Server durchzuführen. Es ermöglicht das Herstellen einer SFTP-Verbindung, das Hochladen einer Datei auf den Server und das Beenden der Verbindung. Der Code wird in einem sogenannten Here-Dokument (eingeschlossen zwischen <<EOF und EOF) ausgeführt, was bedeutet, dass der darin enthaltene Text als Eingabe für das expect-Programm verwendet wird.

Hier ist eine Erläuterung des Codes:

  • spawn sftp -P2222 $SFTP_USER@$SFTP_HOST: Der Befehl spawn startet das sftp-Programm und stellt eine Verbindung zum angegebenen SFTP-Server her. $SFTP_USER und $SFTP_HOST sind Variablen, die den Benutzernamen und den Hostnamen des SFTP-Servers enthalten. Die Option -P2222 gibt den Port für die SFTP-Verbindung an (in diesem Fall Port 2222).
  • expect "password:": Der Befehl expect erwartet, dass der Text "password:" in der Ausgabe des SFTP-Programms angezeigt wird. Sobald dieser Text angezeigt wird, wird mit dem nächsten Schritt fortgefahren.
  • send "$SFTP_PASSWORD\r": Der Befehl send sendet das in der Variable $SFTP_PASSWORD gespeicherte Passwort an den SFTP-Server. Das \r steht für einen Carriage Return (Zeilenumbruch) und simuliert die Eingabe der Eingabetaste, um das Passwort zu bestätigen.
  • expect "sftp>": Der Befehl expect erwartet, dass der Text "sftp>" in der Ausgabe des SFTP-Programms angezeigt wird. Sobald dieser Text angezeigt wird, wird mit dem nächsten Schritt fortgefahren.
  • send "cd $SFTP_REMOTE_DIR\r": Der Befehl send sendet den Befehl cd $SFTP_REMOTE_DIR an den SFTP-Server. $SFTP_REMOTE_DIR ist eine Variable, die das Verzeichnis auf dem Server enthält, in das gewechselt werden soll. Das \r steht wiederum für einen Carriage Return, um den Befehl auszuführen.
  • expect "sftp>": Der Befehl expect erwartet erneut den Text "sftp>" in der Ausgabe des SFTP-Programms, um sicherzustellen, dass das Verzeichnis erfolgreich gewechselt wurde.
  • send "put $BACKUP_DIR/$BACKUP_FILE\r": Der Befehl send sendet den Befehl put $BACKUP_DIR/$BACKUP_FILE an den SFTP-Server. $BACKUP_DIR/$BACKUP_FILE ist der Pfad und Name der Datei, die hochgeladen werden soll. Das \r löst die Übertragung der Datei aus.
  • expect "sftp>": Der Befehl expect erwartet erneut den Text "sftp>" in der Ausgabe des SFTP-Programms, um sicherzustellen, dass die Datei erfolgreich hochgeladen wurde.
  • send "bye\r": Der Befehl send sendet den Befehl "bye" an den SFTP-Server, um die SFTP-Verbindung zu beenden. Das \r löst die Ausführung des Befehls aus.
  • expect eof: Der Befehl expect erwartet das Ende der Ausgabe des SFTP-Programms, was darauf hinweist, dass die SFTP-Sitzung beendet wurde.

Speichern Sie das Skript und schließen Sie den Editor.

Hinweis

Stellen Sie sicher, dass das Programm expect auf Ihrem System installiert ist. Sie können es normalerweise über den Paketmanager Ihrer Linux-Distribution installieren.

sudo apt install expect 

Schritt 8: Skript ausführbar machen

Geben Sie im Terminal den folgenden Befehl ein, um das Skript ausführbar zu machen:

chmod +x backup_script.sh

Schritt 9: Skript ausführen

Führen Sie das Skript aus, indem Sie den folgenden Befehl im Terminal eingeben:

./backup_script.sh

Das Skript wird nun die MySQL-Datenbank sichern, das angegebene Verzeichnis und die SQL-Datei komprimieren, die SQL-Datei anschließen löschen und die Backupdateien per SFTP auf den anderen Server übertragen.

Hinweis

Stellen Sie sicher, dass Sie die erforderlichen Berechtigungen und Zugriffsrechte für das Ausführen des Skripts sowie den Zugriff auf die Dateien, Ordner und die MySQL-Datenbank haben.

Sie können das Skript auch automatisch zu einem bestimmten Zeitpunkt ausführen lassen, indem Sie einen Cron-Job einrichten. Das ermöglicht regelmäßige Backups nach einem bestimmten Zeitplan.

Achtung

Beachten Sie, dass das Speichern von Passwörtern im Klartext in einem Skript aus Sicherheitsgründen nicht empfohlen wird. Eine sicherere Alternative besteht darin, Schlüsselbasierte Authentifizierung zu verwenden. Dies zeigen wir in Kürze in einem weiteren Tutorial.