BASH Einstellungsdateien für die eigenen Skripten nutzen
Aus Fedorawiki.de
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.