• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Shell-Backupscript erstellen

aski011

Newbie
Hallo Allerseits,

ich habe die Aufgabe bekommen, ein Shell-Backupscript zu schreiben, welches gewisse Anforderungen gerecht wird. Diese lauten wie folgt:

  • bei Aufruf "basicbackup.sh full" ein Komplettbackup (komplett.tgz) der Verzeichnisse ~/ und /etc erstellt

  • bei Aufruf "basicbackup.sh differenziell" ein differenzielles Backup (differenziell.tgz) zum Komplettbackup erstellt

  • bei Aufruf "basicbackup.sh inkrementell" ein Backup (WOCHENTAGSNAME.tgz) mit Änderungen im Vergleich zum Vortag erstellt.

Nun bin ich leider blutiger Anfänger in der Linux-Welt und auch was das Shell-Scripting betrifft. Ganz unerfahren was das programmieren angeht bin ich allerdings nicht.

Als Basis dient folgendes Script:

Bash:
# Was gesichert werden soll.
backup_files="/home /var/spool/mail /etc /root /boot /opt"

# Wo das Backup erstellt werden soll.
dest="/mnt/backup"

# Erstelle Archive Name.
day=$(date +%A)
hostname=$(hostname -s)
archive_file="$hostname-$day.tgz"

# Gebe eine Backup-Start Message aus.
echo "Backing up $backup_files to $dest/$archive_file"
date
echo

# Backup the files using tar.
tar czf $dest/$archive_file $backup_files

# Gebe eine Message aus, wenn das Backup abgeschlossen ist.
echo
echo "Backup finished"
date

# Long listing of files in $dest to check file sizes.
ls -lh $dest


Nun fehlen noch die If-Bedingungen anhand derer entschieden wird, welche Art von Backup erstellt wird. Leider habe ich keine Idee, wie ich die implementiere. Kann mir da jemand weiterhelfen?

Viele Grüße
 

Tealk

Newbie
Du könntest es etwa so lösen:
Bash:
if [ "$1" = "full" ]; then
    zeugs für das full backup
  exit 0
elif [ "$1" = "differenziell" ]; then
    zeugs für das differenziell backup
  exit 0
elif [ "$1" = "inkrementell" ]; then
    zeugs für das inkrementell backup
  exit 0
else
    echo "es wurde keine Option angegeben"
    exit 1
fi

alternativ ginge auch
Bash:
case "$1" in
full)
  zeugs für das full backup
  exit 0
  ;;
differenziell)
  zeugs für das differenziell backup
  exit 0
  ;;
inkrementell)
  zeugs für das inkrementell backup
  exit 0
  ;;
*)
  echo "es wurde keine Option angegeben"
  exit 1
  ;;
esac

wobei ich da eher auf bewährte Methoden gehen würde wie borgbackup; denke das das auslesen des Archivs und die Änderungen bestimmen nicht ganz trivial sind und dann muss man immer noch 2 Backups auspacken weil ja nicht alle daten im differenziell enthalten sind.
 
Zuletzt bearbeitet:

Tealk

Newbie
Als Basis dient folgendes Script:
Das würde ich auch ein wenig anpassen:
Bash:
#!/bin/bash

# Was gesichert werden soll.
backup_files="/home /var/spool/mail /etc /root /boot /opt"

# Wo das Backup erstellt werden soll.
dest="/mnt/backup"

# Erstelle Archive Name.
day=$(date +%A)
hostname=$(hostname -s)
archive_file="${hostname}-${day.tgz}"

# Gebe eine Backup-Start Message aus.
printf "Backing up %s to %s/%s" "${backup_files}" "${dest}" "${archive_file}"
date
printf "\n"

# Backup the files using tar.
tar czf "${dest}"/"${archive_file}" "${backup_files}"

# Gebe eine Message aus, wenn das Backup abgeschlossen ist.
printf "\n"
echo "Backup finished"
printf "\n"

# Long listing of files in $dest to check file sizes.
ls -lh "${dest}"

dazu kann ich dir auch noch ShellCheck – shell script analysis tool empfehlen
 

susejunky

Moderator
Teammitglied
Hallo aski011,

zunächst erst einmal ein herzliches Willkommen hier im Forum.

... ich habe die Aufgabe bekommen, ein Shell-Backupscript zu schreiben, welches gewisse Anforderungen gerecht wird. Diese lauten wie folgt:
Wer hat Dir diese Aufgabe gestellt?

Wenn Deinen Kenntnisse zum Thema Shell-Scripting für eine solche Aufgabe nicht ausreichen, dann solltest Du das demjenigen, der Dir diese Aufgabe übertragen hat, besser eingestehen. Denn selbst wenn Dir hier jemand eine Lösung präsentiert, wirst Du nicht in der Lage sein, deren Qualität zu beurteilen, eventuelle Fehler zu erkennen und diese eigenständig zu korrigieren, von einer Funktionserweiterung ganz zu schweigen.

Hier ein paar Links, anhand derer Du Dich in das Thema Shell-Scripting einarbeiten kannst:

Viele Grüße

susejunky
 
OP
A

aski011

Newbie
Nabend zusammen und zuerst einmal vielen Dank für eure Antworten.
Keine Sorge, es handelt sich dabei tatsächlich um eine Übungsaufgabe, und hat somit keine großartige Bedeutung. Allerdings wurde mein Ehrgeiz geweckt und ich würde die Aufgabe gerne in den kommenden Tagen lösen wollen.

Ich werde mir morgen mal in Ruhe eure verlinkten Seiten anschauen und gucken, ob sie mich weiter bringen.... Höchstwahrscheinlich werde ich euch aber noch mit ein paar weiteren Fragen nerven ;-)
 
OP
A

aski011

Newbie
Nabend Zusammen,

so, ich habe mir etwas zusammengebastelt und wollte mal eure Meinung dazu hören.


Bash:
if [ "$1" = "full" ]; then
    #!/bin/bash
    DATE=$(date +%Y-%m-%d-%H%M%S)
    BACKUP_DIR="/zielverzeichnis/backup"
    SOURCE="$HOME/quellverzeichnis"
    tar -cvzpf $BACKUP_DIR/backup-$DATE.tar.gz $SOURCE
    exit 0
elif [ "$1" = "differenziell" ]; then
    $ tar --verbose --create --file=/mnt/data/documents0.tar --listed-incremental=/mnt/    data/documents.snar ~/GewünschteVerzeichnis
    $ cp /mnt/data/documents.snar /mnt/data/documents.snar-1
    $ tar --verbose --create --file /mnt/data/documents0.tar --listed-incremental=/mnt/data/documents.snar-1 ~/GewünschteVerzeichnis
    exit 0
elif [ "$1" = "inkremmentell" ]; then
    #!/bin/bash
    BACKUP_DIR="/zielverzeichnis/backup"
    ROTATE_DIR="/zielverzeichnis/backup/rotate"
    TIMESTAMP="timestamp.dat"
    SOURCE="$HOME/quellverzeichnis "
    DATE=$(date +%Y-%m-%d-%H%M%S)
    EXCLUDE="--exclude=/mnt/* --exclude=/proc/* --exclude=/sys/* --exclude=/tmp/*"
    cd /
    mkdir -p ${BACKUP_DIR}
    set -- ${BACKUP_DIR}/backup-??.tar.gz
    lastname=${!#}
    backupnr=${lastname##*backup-}
    backupnr=${backupnr%%.*}
    backupnr=${backupnr//\?/0}
    backupnr=$[10#${backupnr}]
    if [ "$[backupnr++]" -ge 30 ]; then
    mkdir -p ${ROTATE_DIR}/${DATE}
    mv ${BACKUP_DIR}/b* ${ROTATE_DIR}/${DATE}
    mv ${BACKUP_DIR}/t* ${ROTATE_DIR}/${DATE}
    backupnr=1
    fi
    backupnr=0${backupnr}
    backupnr=${backupnr: -2}
    filename=backup-${backupnr}.tar.gz
    tar -cpzf ${BACKUP_DIR}/${filename} -g ${BACKUP_DIR}/${TIMESTAMP} -X $EXCLUDE ${SOURCE]
    exit 0
else
    echo "Es wurde keine Option angegeben"
    exit 1
fi
 

susejunky

Moderator
Teammitglied
Hallo aski011,

ein Skript muss (bis auf wenige Ausnahmen) immer mit den Zeichen #! beginnen, gefolgt von der Angabe, welcher Interpreter das Skript ausführen soll.
Code:
#!/bin/bash

if [ "$1" = "full" ]; then
...

Viele Grüße

susejunky
 

marce

Guru
müssen nicht - ggf. bekommt man halt Probleme, wenn auf dem System, wo das Script ausgeführt wird, eine andere Shell konfiguriert ist, als auf dem, wo man es entwickelt hat.
 

framp

Moderator
Teammitglied
Ich verstehe dass das Script eine Uebungsufgabe ist. Der Vollstaendigkeit halber moechte ich aber noch erwaehnen dass in Produktionsumgebungen noch eine Fehlerbehandlung bzw -notifizierung eingebaut werden sollte.
 
Oben