BASH Einstellungsdateien für die eigenen Skripten nutzen

Aus Fedorawiki.de

Wechseln zu: Navigation, Suche

Einstellungsdateien für die eigenen Skripten nutzen

Grundsätzliches: Für diese Aufgabe muss kein komplexes Teilprogramm geschrieben werden, es sei denn, eine hohe Sicherstufe oder ein eigene Datenstruktur in der Einstellungsdatei ist erwünscht. Für diese Zwecke kann das BASH-Kommando source im Skript genutzt werden. Es führt ein Skript nicht aus, wie es das tut, wenn es in einer interaktiven Shell benutzt wird, es ergänzt den Inhalt in die aktuellen Shell, als wäre er gegenwärtig.

#!/bin/bash
echo "Lese Einstellungsdatei..." >&2
source /blah/blah.ein
echo "Variableninhalt des Nutzernamens: $Nutzername" >&2
echo "Variableninhalt des Systemnamens: $Systemname" >&2

Die Variablen werden aus der Datei blah.ein gelesen, dort sind sie definiert. Durch das Kommando source werden sie in der aktuellen Shell vom aufrufenden Skript ausgeführt. Das ist nicht das gleiche wie das Ausführen der gleichen Datei als Skript.

Inhalt der Einstellungsdatei blah.ein:

Nutzername="Test"
Systemname="blah.test.de"

Dies sind normale Argumente, die von BASH richtig behandelt werden. Der Nachteil dieser Methode ist, alles wird ohne besondere Prüfung ausgeführt, auch gefährliche Kommandos.

Das Kommando source ist auch unter dem Namen . nutzbar. Der Gebrauch ist identisch. Ganz wichtig ist ein Leerzeichen zwischen dem Punkt und der Datei:

#!/bin/bash
echo "Lese Einstellungsdatei..." >&2
. /blah/blah.ein
echo "Variableninhalt des Nutzernamens: $Nutzername" >&2
echo "Variableninhalt des Systemnamens: $Systemname" >&2

Benutzerdefinierte Einstellungsdateien:

Ein Weg eine systemweite Einstellungsdatei zu nutzen und bei Vorhandensein einer Nutzer-Einstellungsdatei dieser den Vorzug zu geben, zeigt folgendes Beispiel. Im Beispiel wird die Nutzer-Einstellungsdatei, falls vorhanden, andernfalls wird auf die Datei im Verzeichniszweig /etc/ zurückgegriffen.

#!/bin/bash
echo "Lese Systemweite Einstellungsdatei..." >&2
. /etc/blah.ein
if [ -r ~/.blah.ein ]; then
 echo "Lese Nutzer-Einstellungsdatei...." >&2
 . ~/.blah.ein
fi

So kann die ganze Angelegenheit sicherer gemacht werden:

Wie Eingangs erwähnt, wird alles aus der Einstellungsdatei interpretiert. Es ist grundsätzlich ein inkludiertes Skript. Das erhöht das Sicherheitsrisiko. Die Person die Schreibrechte auf diese Datei hat, kann beliebige Programme ausführen.

Ein nicht ganz erwünschtes Skript:

# Tolle Einstellungsdatei für mein noch tolleres Skript :-)
Nutzername="Kennt nur Gott"
Systemname="Ich.bin-wichtig.de"
# Skript-Einfügung
echo "...und morgen die ganze Welt"
echo rm -fr ~/*
mailto=Merkel@Bundestag.de

Sollen nur Syntax-Konstrukte wie NAME=WERT (Variablen Zuweisungen) und vielleicht noch Kommentare (die technisch sowieso irrelevant sind) in dieser Datei genutzt werden, kann das unterbunden werden. Ein Weg um das Skript ein wenig sicherer zu gestalten, ist die Nutzung von egrep (entspricht grep -E(xtended)(erweitert)). Der gelesene Inhalt wird gefiltert und in eine neue Datei geschrieben, erst diese neue gefilterte Datei wird von source interpretiert.

#!/bin/bash
Einstellungsdatei='/etc/blah.ein'
Sichere_Einstellungsdatei='/tmp/blah.ein'
# Durchsucht den Inhalt anch ungewollten Zeichenfolgen
if egrep -q -v '^#|^[^ ]*=' "$Einstellungsdatei"; then
echo "Einstellungsdatei entspricht nicht den Vorgaben, wird gefiltert..." >&2
# Filtert gültige Einstellungswerte
egrep '^#|^[^ ]*='  "$Einstellungsdatei" > "$Sichere_Einstellungsdatei"
Einstellungsdatei="$Sichere_Einstellungsdatei"
fi
# Jetzt wird entweder die gültige Einstellungsdatei oder die bereinigte Einstellungsdatei interpretiert.
source "$Einstellungsdatei"

Um zu verdeutlichen was im Skript geschieht:
Das Skript prüft ob nicht gewollte Zeichenketten vorhanden sind, wenn doch, wird der Inhalt auf gültige Werte beschränkt in dem nach dem gesetzten Filter die Einträge in die neue Datei geschrieben werden und der Variable $Einstellungsdatei die sichere Einstellungsdatei zugewiesen. In der letzten Zeile wird die Datei in der Variable interpretiert. Dies kann die ursprüngliche sein, wenn sie gültig war oder die bereinigte Einstellungsdatei. Der Filter erlaubt nur Name=Wert Konstrukte und Kommentare (beginnend mit #). Dies gibt keine 100%-ige Sicherheit, erhöht die Sicherheit jedoch enorm.