Automatisierung mit der Bash-Shell (3)

Lesezeit
5 Minuten
Bis jetzt gelesen

Automatisierung mit der Bash-Shell (3)

21.08.2023 - 07:43
Veröffentlicht in:

Unter Linux und in der Unix-Welt erledigen Admins ihre Aufgaben bevorzugt mit der Bash-Shell, mit der sich über Skripte die Systemverwaltung auch automatisieren lässt. Dieser Workshop zeigt Tipps und Tricks rund um Bash-Skripte, die dabei helfen, beispielsweise Logdaten auszuwerten, dem Endanwender eine GUI für notwendige Interaktionen zu präsentieren oder Daten mit Python-Skripten auszutauschen. Im dritten Teil werfen wir einen Blick darauf, wie Sie eine grafische Oberfläche für Endanwender erzeugen und mit Triggern automatische Ausführungen anstoßen.

Shell-Skripte automatisieren Aufgaben, doch manche von diesen lassen sich aus technischen Gründen nicht vollständig automatisieren und erfordern menschliche Interaktion. Dabei lehrt die Erfahrung, dass umso geringer die Anforderungen an menschliche Hilfskräfte sind, desto geringer die anfallenden Kosten. Die Praxis zeigt uns zudem, dass Terminal-Fenster auf technisch unerfahrene Personen einschüchternd wirken – grafische Menüs gelten als leichter verwendbar.

Grafische Oberfläche für Endanwender erzeugen
Anbieter von Linux-Distributionen bekämpfen dieses Problem durch ein als "dialog" bezeichnetes Utility. Auf Seiten Ihres Shell-Skripts verhält sich dialog analog zum zuvor eingebundenen Python-Skript. Im Terminal des Benutzers erscheinen dann optisch ansprechende Menüs. Diese lassen sich mit der Tastatur bedienen, was wesentlich sicherer wirkt als ein einfacher Eingabe-Cursor. Da das dialog-Tool die angezeigten Steuerelemente unter Nutzung von ASCII-Sonderzeichen rendert, funktionieren sie im Allgemeinen auch per SSH beziehungsweise Telnet. Für einen ersten Versuch wollen wir einen Dialog einblenden, der den Systemtyp abfragt (Bild 4).

Das Skript fragt den Benutzer nach der Art des vorliegenden Systems.
Bild 4: Das Skript fragt den Benutzer nach der Art des vorliegenden Systems.
 

Vor dem Einsatz des Werkzeugs müssen wir überprüfen, ob es auf dem Zielsystem vorhanden ist. Dies ist zwar in so gut wie allen modernen Linux-Distributionen der Fall, fehlt das dialog-Tool jedoch, installieren Sie es wie folgt:

sudo apt-get install dialog

Im nächsten Schritt befehlen Sie die Anzeige der Dialogbox. Das dialog-Utility ist für alle Arten von anzuzeigendem Benutzerinterface gleich. Die an das Programm übergebenen Parameter entscheiden, welche Art von Steuerelement erscheint:

/bin/bash
dialog --title "Systemtyp" --yesno
"Is this a SLINKER?" 6 40 response=$?

Der Parameter "--yesno" legt fest, dass wir eine mit "Ja" oder mit "Nein" zu beantwortende Anfrage erzeugen. Über den darauffolgenden String bestimmen wir den Titel des Dialogfensters, die Werte 6 und 40 bestimmen die Größe des Fensters in Zeichen. Ein Yes-No-Dialog liefert Benutzereingaben unseres Shell-Skripts über das Return-Code-System weiter. Die Auswertung setzt drei Fälle voraus:

case $response in
   0) echo "Slinker erkannt";;
   1) echo "Anderes System erkannt";;
   255) echo "[ESC]";;
esac

Dialog gibt "0" zurück, wenn der Benutzer die Anfrage bejaht. Verneint er sie, so kommt der Wert "1" beim Shell-Skript an. Quittiert ein Anwender die Anfrage durch Drücken der Escape-Taste, kennzeichnet das System diesen Sonderfall durch Rückgabe des Werts "255".

Der Aufruf von "dialog" zerstört die im Terminal befindlichen Informationen.
Bild 5: Der Aufruf von "dialog" zerstört die im Terminal befindlichen Informationen.
 

Für Admins stellt sich der Einsatz von dialog in aller Regel unproblematisch dar. Ärgerlich ist jedoch, dass das Terminal nach der Anzeige eines Abfragefensters den in Bild 5 gezeigten grafischen Schrott enthält. Auf den meisten Betriebssystemen bietet dialog ein Sonderregime an, das dieses Problem umgeht.

Hierzu benötigen wir einen zusätzlichen Parameter:

bin/bash

dialog  --keep-tite  --title "Systemtyp" --yesno "Is this a SLINKER?" 6 40
response=$?

Auf unterstützten Betriebssystemen speichert das dialog-Tool den Inhalt des Terminalfensters und wechselt danach in einen anderen virtuellen Screen. Dieser kümmert sich um die Anzeige des grafischen Dialogfelds, um zu guter Letzt wieder zu verschwinden.

Bei Übergrabe des Parameters "--keeptite" treten die Grafikfehler nicht auf. Allerdings funktioniert dies nicht immer, insbesondere ältere Terminalemulatoren bekommen mit diesem Betriebsmodus Probleme.

Doch das dialog-Werkzeug ist nicht auf das Einblenden einfacher Ja-Nein-Anfragen beschränkt. Möchten Sie die Nutzer aus einer Liste von Optionen wählen lassen, nutzen Sie den "--menu"-Parameter:

bin/bash
cache=$?
dialog  --keep-tite --menu "Systemtyp" 12 40 2 1 "Spotter" 2 "Slinker" 2>$cache
response=$(<$cache)

Das Kommando übernimmt neben dem im Menü anzuzeigenden String eine Gruppe von Zahlen, auf die eine Attributliste folgt. Als Erstes betrachten wir die drei Zahlen, die im Fall unseres Beispiels "12 40 2" lauten. Die ersten beiden legen – analog zum zuvor vorgestellten "YesNo" – die physische Größe des Dialogs fest. Beachten Sie, dass dialog diese Größe komplett, also inklusive der vom Tool dargestellten Steuerelemente, berechnet. Für die Anzeige eines Menüs benötigt das Werkzeug viel Platz, die hier gewählten zwölf Zeilen Maximalhöhe sind für ein Menü mit zwei Optionen nicht übertrieben. Der dritte Wert legt die Anzahl der Menüeinträge fest.

Das Anliefern der eigentlichen Menüeinträge erfolgt durch die darauffolgenden Einträge, die in unserem Beispiel "1 Spotter 2 Slinker" lauten. Parameter 1 ist normalerweise ein numerischer Index, während der darauffolgende String den eigentlichen Text der Menüoption bestimmt. Die Rückgabe der mit dem Parameter "--menu" aus- gerufenen Dialog-Instanzen erfolgt im Standard-Fehlerstrom. Unser Programm leitet ihn durch die "Passage 2>$cache" in eine lokale Variable um. Das eigentliche Auswerten erfolgt per case-Befehl:

case $response in
   1) echo "Spotter erkannt";;
   2) echo "Slinker erkannt";; 255) echo "[ESC]";;
esac

Während der Programmausführung präsentiert dialog das Auswahlfenster aus Bild 6.

Die Zielsystemauswahl durch den Endanwender erfolgt grafisch.
Bild 6: Die Zielsystemauswahl durch den Endanwender erfolgt grafisch.
 

Beachten Sie, dass die an die Menüeinträge übergebenen Zahlen nicht bei "1" beginnen müssen. Es ist legitim, nach folgendem Schema die Werte "2" und "3" anzugeben:

cache=$?

dialog  --keep-tite --menu "Systemtyp" 12 40 2 2 "Spotter" 3 "Slinker" 2>$cache

Das dialog-Tool nutzt die übergebenen Ziffern nicht nur zur Identifikation der Rückgabewerte, sondern auch als Hotkeys zur Aktivierung der jeweiligen Option. Im Fall der hier verwendeten Parameter "2 Spotter 3 Slinker" müssen Sie in der Case-Selektion die Konstanten "2" und "3" entgegennehmen.

Automatische Ausführung durch Trigger
Shell-Skripte lassen sich zur Automatisierung regelmäßig anfallender Aufgaben wie der Wartung von Datenträgern oder der Aktualisierung eines Archivs einspannen. Der bequemste Weg zum automatischen Starten von Shell-Skripten ist auf Unix-Systemen der Cron-Daemon. Er aktiviert als "Crontab" bezeichnete Aufträge, wenn die erforderlichen Bedingungen gegeben sind. Der wichtigste Crontab ist unter Ubuntu die Datei "/etc/crontab".

Cron-Tabellen sind in zwei Teile eingeteilt: Als Erstes finden Sie die Definition einiger Umgebungsvariablen, der zweite Teil enthält die eigentlichen Jobs. Die Variablendeklaration ist wichtig, weil der Cron-Daemon Tasks in einer unparametrierten Shell ausführt – der in normalen Terminals geltende Pfad ist nicht verfügbar. Daraus folgt, dass die Pfade der per Cronjob aufzurufenden Aufgaben voll qualifiziert sein sollten.

Der zweite Teil des Crontab besteht aus nach dem Schema "* * * * *" aufgebauten Werten. Die einzelnen Sterne stehen dabei für die Abfolge Minute, Stunde, Tag, Monat, Wochentag. Die Ausführung von Cronjobs ist zeitgesteuert, "Filter" bestimmen über die Aktivierung der Payloads. Die Filterbedingung "* * * * *" erzeugt einen Job, den Cron jede Minute aufruft. Über das "/"-Zeichen legen Sie eine Schrittweite fest, so bedeutet beispielsweise "*/2 * * * *", dass der darauffolgende Job alle zwei Minuten auszuführen ist. Die sonstige Jobbeschreibung besteht aus dem Namen des für die Ausführung verantwortlichen Users (hier Root) und dem anzuwerfenden Kommando.

Das manuelle Erzeugen der Filter-Strings ist jedoch fehleranfällig. Auf crontab-generator.org finden Sie eine Webapplikation, die Schritt für Schritt durch die Erzeugung eines Cronstrings führt. Das Programm fragt im ersten Schritt die Häufigkeit der Ausführung ab und bietet danach auch Optionen zur Umleitung der Ausgabe in Logging und Co. Nach getaner Arbeit muss der String in die Cron-Tabelle wandern. Auf manchen Systemen ist ein Neustart des Cron-Daemons oder der Aufruf eines Kommandozeilenwerkzeugs erforderlich. Haben Sie einen Filter-String und möchten wissen, wie oft er zur Ausführung gelangt, bietet sich ein Webdienst wie crontab.guru an. Geben Sie den Filterstring dort in die Textbox ein, berechnet die Applikation die Häufigkeit des Aufrufs.

Linux-Distributionen unterscheiden sich im Bereich der von Crontabs unterstützten Filter. Wohl ob des Chaos, das mit der Umstellung der Init-Systeme einherging, gibt es auf vielen Plattformen das Statement "@reboot". Ein mit diesem Attribut ausgestatteter Cron-Auftrag gelangt immer dann zur Ausführung, wenn die Arbeitsstation hochfährt. Möchten Sie Skripte beim Auftauchen bestimmter Peripheriegeräte ausführen, bieten sich UDEV-Trigger an.

Fazit
Intelligent gestaltete Shell-Skripte sparen Zeit und Geld und tragen zur Optimierung von Workflows im Unternehmen bei. Die hier vorgestellten Werkzeuge verleihen Ihren Administrationsskripten den letzten Schliff. Insbesondere im Zusammenspiel mit Python-Payloads gibt es kaum eine Aufgabe, die sich  nicht durch intelligente Werkzeugkombination lösen lässt.

jp/ln/Tam Hanna

Im ersten Teil der Workshopserie haben wir uns angeschaut, wie Sie mit Skripten Logdaten automatisch verarbeiten und die Ausgabe von Tonsignalen steuern. Im zweiten Teil haben wir detailliert beschrieben, wie Sie Daten mit Python-Skripten auszutauschen.

Ähnliche Beiträge

Automatisierung mit der Bash-Shell (2)

Unter Linux und in der Unix-Welt erledigen Admins ihre Aufgaben bevorzugt mit der Bash-Shell, mit der sich über Skripte die Systemverwaltung auch automatisieren lässt. Dieser Workshop zeigt Tipps und Tricks rund um Bash-Skripte, die dabei helfen, beispielsweise Logdaten auszuwerten – oder Daten mit Python-Skripten auszutauschen, was wir im zweiten Teil des Workshops im Detail beschreiben.

Automatisierung mit der Bash-Shell (1)

Unter Linux und in der Unix-Welt erledigen Admins ihre Aufgaben bevorzugt mit der Bash-Shell, mit der sich über Skripte die Systemverwaltung auch automatisieren lässt. Dieser Workshop zeigt Tipps und Tricks rund um Bash-Skripte Im ersten Teil schauen wir uns an, wie Sie mit Skripten Logdaten automatisch verarbeiten und die Ausgabe von Tonsignalen steuern.

Effiziente Automatisierung in der Telko-Branche

Die Nachfrage nach Hochgeschwindigkeits-Anbindung über das Handynetz steigt unaufhörlich und neben dem Home Office werden alternative Arbeitsmodelle wie Workation immer populärer. Dieser gesteigerte Bedarf an Konnektivität eröffnet ungeahnte Potenziale für Telekommunikationsunternehmen – vor allem dank intelligenter Automatisierungstechnologien. Welche Rolle dabei unter anderem ITSM 3.0 spielt, lesen Sie im Fachartikel.