Projekt Homeserver im Eigenbau 7: Schreiben von Bash-Scripts

Weil das später vielleicht noch öfter vorkommt, und weil das auch ganz sinnvoll ist, seine Konfigurationsdateien zu sichern, will ich mal kurz auf die Shellscripts eingehen. Im Grunde sind Shellscripts nichts anderes als kleine Textdateien, in denen eine Sammlung von Befehlen stehen. Ganz ähnlich der Batch-Dateien, die unter Windows auch noch gelegentlich eingesetzt werden. Allerdings sind Shellscripts bedeutend mächtiger. Ich habe schon welche gesehen, die Programme installieren, und nach genauer Überprüfung sogar Konfigurationsdateien editieren können. Wer sich eingehend mit den Möglichkeiten von Linux auseinandersetzt, kann hier durchaus hochkomplexe Programme schreiben.

Das ist jetzt aber nicht das, was ich machen möchte. Ich möchte, dass meine Scripte auf Knopfdruck Konfigurationsdateien kopieren oder Pakete nachinstallieren können. Und das ist mit ein paar simplen befehlen gemacht.

Aufbau des Scripts

Jede Zeile, die mit einem # (Nummernzeichen) beginnt, ist ein Kommentar. Unterschätzt das nicht, in ein paar Jahren wisst ihr vielleicht nicht mehr genau, was ein bestimmter Befehl eigentlich tun sollte, daher kommentiert das nach Möglichkeit. Vielleicht habt ihr den Script auch einfach nur einem Bekannten gegeben, der weiß dann nicht, was ihr damit machen wolltet. Nutzt das also ausgiebig.

Jedes Script beginnt mit einem Shebang. Jetzt fragt mich aber nicht, wer auf den merkwürdigen Namen gekommen ist. Aber was es ist, kann ich euch erklären.

Jedes Script wird von einem Interpreter ausgeführt. Dieser kennt die befehle und tut, was im Script steht. Ich meine zwar, auch mal Scripte gesehen zu haben, wo diese erste Zeile fehlt, aber verschiedene Interpreter kennen unterschiedliche Befehle. Daher sollte man diese Zeile auch festlegen. ich verwende immer Bash als Interpreter, daher beginnen meine Scripte alle mit der Zeile:

#!/bin/bash

Ein kleines Script

Schreiben wir doch also einfach mal unser erstes kleines Script. Dieses soll die Konfigurationsdatei für das Netzwerk in das Unterverzeichnis „Server“ in unserem Home-Verzeichnis kopieren.

Zunächst legen wir das Verzeichnis an mit dem Befehl:

mkdir Server

Hier werde ich jetzt alle Konfigurationsdateien, die ich je ändere, reinkopieren lassen, damit ich diese auf einen USB-Stick kopieren kann. Heute soll es aber erst mal nur die Konfiguration des Netzwerks sein.

Öffnen wir also einen Editor, und zwar Nano, mit der Scriptdatei. Die gibt es zwar noch nicht, Nano legt die dann aber an.

nano filecopy.sh

Da wir ja in unserem eigenen Home-Verzeichnis arbeiten, braucht es keine Admin-Rechte und deshalb auch kein sudo vor den Befehlen.

Und nun schreiben wir folgendes in die offene Datei hinein:

#!/bin/bash

## Konfigurationsdateien kopieren

# Konfigurationsdatei für das Netzwerk kopieren
sudo cp /etc/network/interfaces ~/Server

Wie ihr sehen könnt, habe ich alle Aktionen und den Grund des Scriptes in Kommentaren eingefügt. Die letzte Zeile ist der eigentliche Kopierbefehl.

Nun drücken wir STRG+X um Nano zu schließen. Wir werden gefragt, ob wir die Datei erstellen wollen, noch mal den Namen bestätigen, fertig! Unser erstes Script ist da. Aber es kann noch nicht genutzt werden.

Script ausführbar machen

Mit dem Befehl „ls -l“ könnt ihr euch das Inhaltsverzeichnis des Verzeichnisses anzeigen. Da wir ja im Home-Verzeichnis stehen, sehen wir dann folgendes:

total 8
-rw-r--r-- 1 kamil kamil  139 Oct 17 15:14 filecopy.sh
drwxr-xr-x 2 kamil kamil 4096 Oct 17 15:13 Server
kamil@server01:~$

Uns interessiert die obere Zeile, die für die Datei filecopy.sh. Ich werde mal die einzelnen Abschnitte erklären:

  • -rw-r--r--: Das sind die Zugriffsrechte. Der Benutzer darf lesen und schreiben (rw-), die Gruppe und jeder andere dürfen nur lesen (r--). Der erste Bindestrich zeigt, dass es eine Datei ist, Stünde da ein kleines d, wäre es ein Verzeichnis. Das könnt ihr leicht in der Zeile mit dem Verzeichnis „Server“ sehen.
  • 1: Ist nur eine Datei, wäre es ein Verzeichnis, könnte man die Anzahl darin befindlicher Dateien sehen.
  • kamil kamil: Benutzer, Gruppe. Ja, kamil ist auch eine Gruppe, weil jeder Benutzer beim Anlegen auch eine gleichnamige Gruppe angelegt bekommt.
  • 139: Größe der Datei.
  • Oct 17 15:14: Datum, ist ja offensichtlich. 🙂
  • filecopy.sh: Ein Keks! Nee, quatsch, natürlich der Dateiname selbst. 🙂

Sieht auch erst mal komplizierter aus, als es tatsächlich ist. Aber ich habe das so ausführlich gemacht, weil das noch öfter gebraucht wird. Schließlich will man ja mit Dateien arbeiten.

OK, jetzt müssen wir die Datei aber noch ausführbar machen:

chmod +x filecopy.sh

Jetzt gucken wir uns die Zeile doch nochmal an:

-rwxr-xr-x 1 kamil kamil  139 Oct 17 15:14 filecopy.sh

Das x zeigt jetzt an, dass die Datei ausführbar ist. Nun können wir sie mal testen.

Aufruf eines Scripts

Unser Script ist nun bereit, ausgeführt zu werden. Jedes Script wird aus dem Verzeichnis, wo es liegt, folgendermaßen aufgerufen:

./filecopy.sh

Geben wir diesen Befehl so ein, so scheint es, als wäre nichts passiert. Oder doch, evtl. werdet ihr noch nach eurem Passwort gefragt, es wird ja ein sudo-Befehl ausgeführt im Script. Aber sonst? Es erscheint wieder die Eingabeaufforderung.

Ergebnis prüfen

Schauen wir doch mal nach, ob das Kopieren geklappt hat. Also gehen wir mit dem Befehl „cd Server“ in das Verzeichnis „Server“ und rufen mal das Inhaltsverzeichnis auf:

-rw-r--r-- 1 root root 514 Oct 17 15:35 interfaces
kamil@server01:~/Server$

So, das hat also geklappt. Gut, dann können wir ja wieder mit dem Befehl „cd ..“ eine Verzeichnisebene höher gehen ins Home-Verzeichnis.

Fazit

Auf ganz genau diese Weise trage ich jetzt jede geänderte Konfigurationsdatei in dieses Script ein, welches ich von zeit zu Zeit mal ausführe, um diese Dateien dann auf einem USB-Stick zu sichern. Dann schreibe ich noch ein Script, dass all diese Konfigurationsdateien auch wieder an ihren Ursprungsort kopiert, und bei einer Neuinstallation habe ich so in wenigen Sekunden meine Konfiguration des Servers wiederhergestellt. Und in das Script installserver.sh schreibe ich dann all die sudo apt-get install xxx Befehle rein, so dass diese auch nicht mehr per Hand gemacht werden müssen.

Je mehr wir über Linux lernen, können wir sicher auch mal komplexere Scripts schreiben, aber ich halte diese Scripte für wichtig. Später, wenn ihr viel am Server konfiguriert habt, müsstet ihr sonst Stunden damit verbringen, alles wieder richtig zu konfigurieren. So sind es nur paar Sekunden.

Viel ausführlichere Informationen über Scripting findet ihr auch im Wiki ubuntuusers.de. Zwar bezieht sich das Wiki auf Ubuntu, aber diese Informationen sind universell einsetzbar.

Ich hoffe, ihr seid soweit mitgekommen. Falls nicht, können wir das gerne in der Liste noch ausdiskutieren, und evtl. passe ich dann mit euren Vorschlägen den Artikel noch an.