Aus Raspberry Pi Geek 08/2022

Datenströme mit Pipes umleiten (Seite 4)

Es soll aber nicht nur die Möglichkeit bestehen, Kommandos auf einer entfernten Maschine auszuführen, sondern auch, Dateien zu übertragen. Um das zu bewerkstelligen, gilt es jedoch, eine Hürde zu meistern. Es lassen sich nicht beliebig lange Zeilen mittels echo ausgeben. Damit der Empfänger die gesendeten Zeichen nicht eventuell als Steuerzeichen interpretiert, müssen Sie die Binärdaten zusätzlich in reinen ASCII-Code umwandeln.

In früheren Unix-Varianten gab es für solche Zwecke das Kommando uuencode und das Gegenstück uudecode. Diese Befehle stehen zwischenzeitlich aber nicht mehr zwingend zur Verfügung, weshalb hierfür ein Python-Modul zum Einsatz kommt.

Ablaufplan

Der Listener liest die Empfangs-Pipe aus und leitet entsprechende Aktionen ein. Empfängt er eine Zeile, die ein auszuführendes Kommando enthält, prüft er zunächst, ob es eine Textdatei gibt, die das letzte verwendete Verzeichnis enthält. Im nächsten Schritt schreibt er die Zeichenkette BEGIN_CMD_OUT in den ausgehenden Datenstrom (Abbildung 4).

Abbildung 4: Programmablaufplan für das Senden von Dateien an fremde Rechner.

Abbildung 4: Programmablaufplan für das Senden von Dateien an fremde Rechner.

Sofern übergeben, wechselt der Prozess daraufhin in das gewünschte Verzeichnis und schreibt ein anschließendes auszuführendes Kommando in eine Subshell. Deren Ausgabe platziert er ebenfalls in den zu sendenden Datenstrom. Dessen Ende markiert die Zeichenkette END_CMD_OUT. Beginnt die empfangene Zeile mit der Zeichenkette END_COMMUNICATION, verlässt der Prozess die Funktion.

Beginnt die Übertragung mit BEGIN_FILETRANSFER, liest die Funktion die Argumente 2 (Dateinamen) und 3 (Zielverzeichnis) aus und schreibt mithilfe von Awk so lange in ein Python-Modul, das das Dekodieren der Daten vornimmt, bis sie die Zeile END_FILETRANSFER empfängt.

Als letzte Möglichkeit prüft die Funktion, ob die empfangene Zeile die Zeichenkette BEGIN_CMD_OUT enthält. Falls ja, gibt sie alle weiteren Zeilen auf dem Bildschirm aus, bis sie die Zeichenkette END_CMD_OUT erhält. Einen Ablaufplan des Listeners finden Sie in Abbildung 5.

Abbildung 5: Programmablaufplan für den Listener.

Abbildung 5: Programmablaufplan für den Listener.

Ausbaufähig

Eine Zusammenfassung aller Funktionen im Skript funktionen bietet die Tabelle “funktionen im Überblick”. Da es sich hier nur um ein Beispiel handelt, das Möglichkeiten für benannte Pipes aufzeigt, erfasst das Skript naturgemäß nicht alle möglichen Probleme.

Funktion

Erläuterung

setenv

Setzt alle benötigten Umgebungsvariablen.

chkpipes

Prüft, ob benötigte Pipes unter /tmp existieren.

createpipes

Erzeugt alle benötigten Pipes unter /tmp.

removepipes

Löscht alle Pipes des jeweiligen Remote-Hosts.

listen

Erzeugt einen Listener, der eingehende Daten ausliest und verarbeitet.

establish

Erzeugt einen Datenstrom in Richtung des zweiten Rechners.

killall

Beendet alle benötigten Hintergrundprozesse.

rcmd

Befehl auf dem entfernten Host ausführen.

sendfile

Datei auf das entfernte System kopieren.

Derzeit kommt es ab und an noch vor, dass die Funktion killall nicht alle Prozesse beim ersten Durchlauf beendet. In dem Fall müssen Sie sie erneut aufrufen. Auch prüft diese Version beim Starten der Listener nicht, ob eventuell schon ein anderer Prozess die Pipes ausliest, was zu Fehlern führen kann. Zudem fehlt aktuelle eine Funktion, die prüft, ob das Zielverzeichnis beim Kopieren einer Datei existiert.

Wenn der lokale Host-Name nicht dem Alias der zugeordneten IP-Adresse entspricht, kommt es ebenfalls zu Fehlverhalten, da die entfernte Seite das nicht weiß. Es gibt noch weitere Möglichkeiten, die Funktionen auszubauen. So wäre es denkbar, eine Kommunikation zwischen beliebig vielen Rechnern aufzubauen. Hierzu gilt es, den jeweiligen Absender an die entfernte Maschine zu übermitteln, damit diese dann die Ausgaben in die jeweils richtigen Pipes schreibt.

Auch bietet es sich an, zur schnelleren Übermittlung ein Kompressionswerkzeug zwischenzuschalten. Entsprechend muss die Zielseite den Datenstrom wiederum dekomprimieren. Eine weitere, interessante Möglichkeit wäre es, den Rückgabewert des ausgeführten Kommandos an den Absender zu übermitteln.

Beachten Sie, dass der Prozess die Datei read.awk in der Grundeinstellung im Verzeichnis /var/tmp/ erwartet. Liegt sie an einem anderen Ort, müssen Sie die Variable awkfile in der Datei funktionen anpassen.

Fazit

Pipes finden sich nicht nur in langen Befehlsketten, sie dienen auch als sehr interessante Werkzeuge bei der Kommunikation zwischen mehreren Prozessen. Die Tatsache, dass das System sie wie normale Dateien behandelt, macht sie in Verbindung mit der Umlenkung von Kanälen auf vielen Unix- und Linux-Systemen zu einer sehr flexiblen Schnittstelle. Dazu trägt auch der Umstand bei, dass Pipes sich auf allen Unix- und Linux-Derivaten identisch ansprechen lassen und somit die Anwendung für den Anwender stets transparent bleibt. (tle)

DIESEN ARTIKEL ALS PDF KAUFEN
EXPRESS-KAUF ALS PDFUmfang: 6 HeftseitenPreis €0,99
(inkl. 19% MwSt.)
RASPBERRY PI GEEK KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Raspberry Pi Geek bei Google Play Readly Logo
Nach oben