Automatisierung mit der Bash-Shell (2)

Lesezeit
2 Minuten
Bis jetzt gelesen

Automatisierung mit der Bash-Shell (2)

14.08.2023 - 07:12
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, was wir im zweiten Teil des Workshops im Detail beschreiben.


Haben Sie eine Gruppe von Shell-Skripten und möchten diese um in Python gehaltene Intelligenz erweitern, bietet sich die Nutzung der Interoperation an. Python- und Shell-Skripte tauschen über Standardeingabe und -ausgabe Informationen aus. Zu erledigende Aufgaben lassen sich so in mehrere Teile zerlegen, jeder Teil entsteht in der für ihn am besten geeigneten Programmiersprache. Für einen ersten Versuch öffnen wir ein Arbeitsverzeichnis und legen eine SH- und eine PY-Datei an:

/pythonazspace$ touch worker.sh

/pythonazspace$ touch worker.py

Daten mit Python-Skripten austauschen
Der einfachste Weg zum Datenaustausch ist das Zurückspielen von als "Return Code" bezeichneten Zahlen. Unix-Programme liefern im Rahmen ihrer Termination einen numerischen Wert zurück. Dieser erlaubt Rückschlüsse darüber, wie die Ausführung des Programms verlief. Die Unix-Standardisierung sieht vor, dass das Zurückliefern von "Null" einen erfolgreichen Programmablauf anzeigt. Liefert eine Anwendung einen anderen Wert als Null, ist die Ausführung fehlgeschlagen. Dabei handelt es sich allerdings nur um eine Konvention und es ist gemäß POSIX-Standard nicht verboten, Return Codes zur Übertragung von Informationen zu nutzen.

Für unseren ersten Versuch wollen wir den Python-Teil scheitern lassen. Dazu müssen wir den Rückgabewert "1" zurückliefern, was über die im stets vorhandenen sys-Modul befindliche Methode "exit" erfolgt, wie unser Mini-Skript zeigt:

import sys
print("Hello World!"); sys.exit(1)

Der Aufruf eines Python-Programms erfolgt in der Bash-Shell durch den Python-Interpreter. Im Interesse der Konsistenz ist es empfehlenswert, auf Python-3-Sprachkonstrukte setzenden Code unter Nutzung der Python-3-Utilities aufzurufen. Das in vielen Fällen als Symlink realisierte Kommando verweist immer auf einen Interpreter, der Python 3.x versteht – auch dann, wenn der normale Python-Befehl zu Python 2.x gehört:

/bin/bash python3 worker.py

response=$?
case $response in
   0) echo "Funktioniert";;
   1) echo "Fehler";;
esac

Nach der Abarbeitung der Datei "worker.py" nutzt unser Programm dann das Makro "response=$?", um den Rückgabewert in eine Shell-Variable zu kopieren. Darauf folgt die Bash-spezifische Case-Selektion, die das Ergebnis auswertet. Sofern Sie in der Python-Datei "sys.exit(1)" stehen lassen, sehen Sie auf der Kommandozeile folgende Ausgabe:

/pythonazspace$ bash ./worker.sh

Hello World!

Fehler

Adaptieren Sie den Rückgabewert stattdessen auf das Retournieren von Null, quittiert das Bash-Skript die Abarbeitung der Python-Payload durch Ausgabe von "Funktioniert".

Möchten Sie Informationen vom Bash-Skript zur Python-Payload übertragen, kommen Parameter zum Einsatz. Die Entgegennahme der Daten erfolgt auf Seiten des Python-Skripts über das in "sys" angelegte Objekt "argv":

import sys

for x in range(0, int(sys.argv[1])): print(sys.argv[2]);

Die vorliegende Payload gibt einen String mehrfach aus. Die Kommandozeilenparameter bestimmen den auszugebenden Text und die Menge der Wiederholungen. Der erste Konsolenparameter hört aufgrund einer Besonderheit von Python auf den Index eins.

Der Wert "sys.argv[0]" enthält den Namen des aufgerufenen Programms, was eine Reflektion ermöglicht. Alle in "sys.argv" enthaltenen Werte sind aus Sicht von Python Strings. Zur Konvertierung des Strings in einen für for-Schleifen verwertbaren Endwert ist "int()" erforderlich.

Der Aufruf des Skripts erfolgt abermals über Python 3, die Übergabe der Kommandozeilenparameter läuft wie bei einem gewöhnlichen Unix-Kommandozeilenwerkzeug ab:

bin/bash

python3 worker.py 5 "Hallo Welt"

Rufen wir das Programm mit den Parametern 5 "Hallo Welt" auf, sehen wir die in Bild 3 gezeigte Ausgabe. Da der auszugebende String Leerzeichen enthält, müssen wir ihn in Anführungszeichen einfassen.

Die Python-Schleife bezieht ihre Parameter aus dem Bash-Skript.
Bild 3: Die Python-Schleife bezieht ihre Parameter aus dem Bash-Skript.
 

Die Python-Payload kann Informationen zurückliefern, die über den Nachrichtengehalt des Return-Codes hinausgehen. Dies erfolgt am einfachsten über die Standardausgabe:

print ("Zeile 1")
print ("Zeile 2")
print ("Zeile 3")

Auf Seiten des Shell-Skripts kümmert sich folgender Code um die Entgegennahme dieser Informationen:

bin/bash
python3 worker.py | while read line
   ; do
      echo $line
done

Die while-Schleife nutzt "read", um die Ausgabe des per Pipe angelieferten Prozesses zeilenweise in Richtung der Variable "line" weiterzuleiten. Das Skript gibt diese danach in seine Standardausgabe aus, die im Terminal der Workstation erscheint.

jp/ln/Tam Hanna

Im dritten Teil der Workshop-Serie werfen wir einen Blick darauf, wie Sie eine grafische Oberfläche für Endanwender erzeugen und mit Triggern automatische Ausführungen anstoßen. Im ersten Teil haben wir uns angeschaut, wie Sie mit Skripten Logdaten automatisch verarbeiten und die Ausgabe von Tonsignalen steuern.

Ähnliche Beiträge

Automatisierung mit der Bash-Shell (3)

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 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.

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.