So lesen Sie Daten aus einem Socket in Bash unter Linux

Veröffentlicht: 2022-06-28
Binärcode, der durch optische Kabel fließt.
XYZ/Shutterstock.com

Mit der Linux-Befehlszeile können Sie Daten abrufen, indem Sie entweder auf einem Socket lauschen oder eine Verbindung zu einem Socket herstellen. Die Daten können in einer Textdatei erfasst werden. Wir zeigen Ihnen wie.

Socket-Clients und -Server

Sockets ermöglichen die Kommunikation vernetzter Software. Sie wurden erstmals im 4.2BSD-Unix-Betriebssystem implementiert, das 1983 an der University of California, Berkeley, entwickelt wurde. Sie wurden schnell von System V Unix und Microsoft Windows übernommen.

Was bedeutet „Alles ist eine Datei“ unter Linux?
VERWANDT Was bedeutet „Alles ist eine Datei“ unter Linux?

Ein Socket ist ein Endpunkt einer Software-Netzwerkverbindung, der so abstrahiert ist, dass er als Dateihandle behandelt werden kann. Das bedeutet, dass es zum allgemeinen Unix- und Linux-Designprinzip „Alles ist eine Datei“ passt. Wir meinen nicht die physische Steckdose an der Wand, in die Sie Ihr Netzwerkkabel stecken.

Wenn sich ein Programm mit einem Socket einer anderen Software verbindet, wird es als Client der anderen Software betrachtet. Software, die es anderer Software ermöglicht, Verbindungen anzufordern, wird als Server bezeichnet. Diese Begriffe werden unabhängig von anderen Verwendungen von Client und Server in der IT-Welt verwendet. Um Verwirrung zu vermeiden, werden sie manchmal als Socket-Client und Socket-Server bezeichnet, um Mehrdeutigkeiten zu vermeiden. Wir nennen sie Clients und Server.

Sockets werden als Anwendungsprogrammierschnittstelle (API) implementiert, die es Softwareentwicklern ermöglicht, die Socket-Funktionalität aus ihrem Code heraus aufzurufen. Das ist in Ordnung, wenn Sie ein Programmierer sind, aber was, wenn Sie es nicht sind? Oder vielleicht sind Sie es, aber Ihr Anwendungsfall rechtfertigt das Schreiben einer Anwendung nicht? Linux stellt Befehlszeilentools bereit, mit denen Sie je nach Bedarf – einfache – Socket-Server und Socket-Clients verwenden können, um Daten von anderen Socket-fähigen Prozessen abzurufen oder zu empfangen.

VERWANDT: Was ist eine API und wie verwenden Entwickler sie?

Beziehungen sind nie einfach

Die Programme, die wir verwenden werden, sind nc und ncat . Diese beiden Dienstprogramme haben eine seltsame Beziehung. Das Programm nc ist eine Neufassung von ncat , das viel älter als nc ist. Aber ncat wurde auch umgeschrieben und lässt uns jetzt einige Dinge tun, die nc nicht kann. Und es gibt viele Implementierungen von ncat , das selbst ein Derivat eines Tools namens netcat ist. Darüber hinaus ist nc bei den meisten Distributionen ein symbolischer Link zu ncat und kein separates Programm.

Wir haben aktuelle Arch-, Manjaro-, Fedora- und Ubuntu-Distributionen überprüft. Das einzige, für das die Tools installiert werden mussten, war Manjaro. Auf Manjaro müssen Sie das netcat -Paket installieren, um nc zu erhalten, aber Sie erhalten nicht ncat , sondern netcat . Und auf Manjaro ist nc ein symbolischer Link zu netcat .

 sudo pacman -S netcat 

Installieren des netcat-Pakets auf Manjaro

Die Quintessenz ist, verwenden Sie auf Manjaro netcat , wenn Sie ncat in den Beispielen in diesem Artikel sehen.

Hören auf einer Steckdose

Wenn Software auf eingehende Socket-Verbindungen wartet, fungiert sie als Server. Alle Daten, die über die Socket-Verbindung kommen, werden vom Server empfangen . Wir können dieses Verhalten sehr einfach mit nc replizieren. Alle empfangenen Daten werden im Terminalfenster angezeigt.

Wir müssen nc mit der Option -l (listen) anweisen, auf Verbindungen zu lauschen, und wir müssen den Port angeben, auf dem wir auf Verbindungen horchen werden. Alle Client-Programme oder -Prozesse, die versuchen, eine Verbindung zu dieser Instanz von nc , müssen denselben Port verwenden. Wir teilen nc mit, auf welchem ​​Port es lauschen soll, indem wir die Option -p (Port) verwenden.

Dieser Befehl startet nc als Socket-Server und wartet auf eine Verbindung auf Port 6566:

 nc -l -p 6566 

nc als Socket-Server starten

Während es auf eine eingehende Verbindung wartet, erzeugt nc keine Ausgabe. Sobald eine Verbindung hergestellt ist, werden alle abgerufenen Informationen im Terminalfenster angezeigt. Hier wurde eine Verbindung von einem Client-Programm hergestellt, das sich als „Client 1“ identifiziert.

nc empfängt Daten von einem Client

Alles, was von nc angezeigt wird, wird vom Client empfangen. Dieser Client sendet zufällig seinen Namen und eine nummerierte Nachricht mit Uhrzeit und Datum.

Wenn der Client seine Verbindung unterbricht, wird nc beendet und Sie kehren zur Terminal-Eingabeaufforderung zurück.

nc wurde nach einer Trennung von der Client-Seite beendet

Senden von Daten an eine Datei

Um die Daten vom Client in einer Datei zu erfassen, können wir die Ausgabe von nc per Umleitung an eine Datei senden. Dieser Befehl speichert die empfangenen Daten in einer Datei namens „logfile.txt“.

 nc -l -p 6566 > Protokolldatei.txt 

Umleitung der Ausgabe von nc in eine Textdatei

Sie werden keine Ausgabe sehen – sie geht in die Datei – und paradoxerweise wissen Sie nicht, ob eine Verbindung zustande gekommen ist, bis nc beendet wird. Die Rückkehr zur Eingabeaufforderung zeigt an, dass eine Verbindung aufgetreten ist und vom Client beendet wurde.

Wir können less verwenden, um den Inhalt der Datei „logfile.txt“ zu überprüfen.

 weniger logile.txt 

Weniger verwenden, um eine Textdatei zu untersuchen

Sie können dann durch die Daten blättern und mit den integrierten Funktionen von Less suchen.

Überprüfung der erfassten Ausgabe von nc in weniger

VERWANDT: So verwenden Sie den Less-Befehl unter Linux

Senden von Daten an eine Datei und das Terminalfenster

Wenn Sie die Daten im Terminalfenster vorbeirollen sehen und gleichzeitig an eine Datei senden möchten, leiten Sie die Ausgabe von nc in tee .

 nc -l -p 6566 | tee logfile.txt 

Ausgabe von nc gleichzeitig in eine Datei und an das Terminalfenster senden

Akzeptieren mehrerer Verbindungen

All das ist in Ordnung, aber es hat Einschränkungen. Wir können nur eine Verbindung akzeptieren. Wir sind darauf beschränkt, Daten von einem einzelnen Client zu erhalten. Auch wenn dieser Client die Verbindung trennt, wird unser Socket-Server nc beendet.

Wenn Sie mehrere Verbindungen akzeptieren müssen, müssen wir ncat verwenden. Wir müssen ncat , zuzuhören und einen bestimmten Port zu verwenden, genau wie wir es mit nc getan haben. Aber wir werden auch die Option -k (keep alive) verwenden. Dies weist ncat an, weiterzulaufen und Verbindungen von Clients zu akzeptieren, selbst wenn die letzte aktive Verbindung unterbrochen wird.

Das bedeutet, dass ncat läuft, bis wir es mit „Strg-C“ beenden. Neue Verbindungen werden akzeptiert, unabhängig davon, ob ncat derzeit mit Clients verbunden ist oder nicht.

 ncat -k -l -p 6566 

Mit ncat auf mehrere Verbindungen warten

Wir können die Daten der verschiedenen Clients sehen, die in der Ausgabe von ncat erscheinen, wenn sie sich verbinden.

Zweiter und dritter Client, der sich mit ncat verbindet

Verbinden mit einem Server

Wir können nc auch als Socket-Client verwenden und eine Verbindung zu einem anderen Programm herstellen, das Verbindungen akzeptiert und als Server fungiert. In diesem Szenario ist nc der Socket-Client. Dazu müssen wir nc mitteilen, wo sich die Serversoftware im Netzwerk befindet.

Eine Möglichkeit besteht darin, eine IP-Adresse und eine Portnummer anzugeben. Wenn sich der Server auf demselben PC befindet, auf dem wir nc , können wir die Loopback-IP-Adresse 127.0.0.1 verwenden. Nicht, dass keine Flags verwendet werden, um die Serveradresse und die Portnummer anzugeben. Wir geben nur die entsprechenden Werte an.

Um eine Verbindung zu einem Server auf demselben PC herzustellen und Port 6566 zu verwenden, könnten wir die Loopback-IP-Adresse verwenden. Der zu verwendende Befehl lautet:

 NC 127.0.0.1 6566 

Verwenden von nc als Socket-Client

Daten, die nc vom Server abruft, scrollen im Terminalfenster vorbei.

Abrufen von Daten von einem Socket-Server mit nc

Wenn Sie den Netzwerknamen des Computers kennen, auf dem die Serversoftware ausgeführt wird, können Sie diesen anstelle der IP-Adresse verwenden.

 nc sulaco 6566 

Verwenden von nc zum Herstellen einer Verbindung zu einem Socket-Server unter Verwendung des PC-Namens, auf dem der Server ausgeführt wird

Verwenden Sie „Strg+C“, um eine Verbindung zu trennen.

Schnell und einfach

nc und ncat das Richtige, wenn Sie keinen benutzerdefinierten Socket-Handler schreiben möchten, aber Daten aus einer Socket-fähigen Quelle sammeln müssen. Durch Umleiten der Ausgabe in eine Datei können Sie die Ausgabe mit less überprüfen und die Datei mit Dienstprogrammen wie grep parsen.

VERWANDT: So verwenden Sie den grep-Befehl unter Linux