black spider on brown wooden table

Bash und Konfigurationen

Ich glaube, es ist kein großes Geheimnis mehr, dass ich gerne Dinge scripte um mein Leben einfacher zu gestalten: Das startet beim Smarthome und zieht sich hin zur Serverwartung und alles was halt sonst so scriptbar ist. Doch diesmal habe ich ein Thema auf dem Herzen, das ich mit euch teilen möchte: Wie arbeitet man mit Konfigurationsdateien in Bash?

Erstmal vorweg: Konfigurationen in Scripts sind Benutzernamen, Server, entfernte Repositories, you name it. Alles was man halt so an Daten in so einem Script braucht. Gerade wenn man seine Scripts öffentlich macht, sollte man darauf achten, nichts zu leaken – denn Leute werden mit dem Zeug rumexperimentieren.

Also was ist die Lösung? Für mich war es vorweg einmal alle Benutzernamen und anderen Krempel in Variablen zu packen um sie leichter anpassen zu können und eventuelle Fehler von der vorherigen Problematik zu lösen. Ist jetzt nichts Großes, aber eine Voraussetzung für eine saubere Lösung.

Der nächste logische Schritt wäre ein externes Config-File. In Bash könnte so eine Lösung wie folgt aussehen:

source /home/myuser/test/config

Und das ist genau das, wo ich mir angefangen habe, Gedanken zu machen. Ein Script zu sourcen heißt es auszuführen. Mit anderen Worten, source ist eine Möglichkeit mit der Config – sofern jemand bösen Code reinbastelt richtig in Schwierigkeiten zu kommen – was sich jedoch durch einfache Tricks vermeiden lässt.

Meine Lösung sieht vor, die Config zu parsen anstatt sie auszuführen. Da Json sehr einfach und lesbar ist, habe ich mir gedacht, kann ich es auch gleich verwenden. Durch den Shell-Parser ‚jq‘ lassen sich Werte auslesen ohne die Datei auszuführen. Wenn ihr mehr auf XML steht, empfehle ich das XML Startlet.

Aber genug der Theorie. Gehen wir die Sache an einem Beispiel an. Eine einfache Config könnte wie folgt aussehen:

{ 
"username": "username-or-email",
"password": "the-password" 
}

In unserem Hauptscript können wir nun Daten mit jq auslesen:

USERNAME="$( jq -r '.username' "$config_file" )"

Und die Moral von der Geschicht‘: Parse deine Config, Exekutiere sie nicht!

Author:

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.