Gegevens lezen van een socket in Bash op Linux

Binaire code die door optische kabels stroomt.
XYZ/Shutterstock.com

Met de Linux-opdrachtregel kunt u gegevens ophalen door te luisteren op een socket of door verbinding te maken met een socket. De gegevens kunnen worden vastgelegd in een tekstbestand. Wij laten u zien hoe.

Socketclients en -servers

Sockets zorgen ervoor dat netwerksoftware kan communiceren. Ze werden voor het eerst geïmplementeerd in het 4.2BSD Unix-besturingssysteem, dat in 1983 werd gecreëerd aan de University of California, Berkeley. Ze werden snel overgenomen door System V Unix en Microsoft Windows.

Wat betekent "Alles is een bestand" in Linux?

VERWANTWat betekent “Alles is een bestand” in Linux?

Een socket is een eindpunt van een softwarenetwerkverbinding, geabstraheerd zodat het kan worden behandeld als een bestandshandle. Dat betekent dat het past bij het algemene Unix- en Linux-ontwerpprincipe van “alles is een bestand”. We bedoelen niet het fysieke stopcontact op de muur waar u uw netwerkkabel op aansluit.

Als een programma verbinding maakt met een socket op een ander stuk software, wordt dit beschouwd als de cliënt van de andere software. Software waarmee andere software verbindingen kan aanvragen, wordt de server. Deze termen worden onafhankelijk van ander gebruik van client en server in de IT-wereld gebruikt. Om verwarring te voorkomen worden ze soms socket cliënt en socket-server dubbelzinnigheid weg te nemen. We gaan ze clients en servers noemen.

Sockets zijn geïmplementeerd als een Application Programming Interface (API), waardoor softwareontwikkelaars vanuit hun code een beroep kunnen doen op de socketfunctionaliteit. Dat is prima als je een programmeur bent, maar wat als je dat niet bent? Of misschien wel, maar uw use case rechtvaardigt het schrijven van een applicatie niet? Linux biedt opdrachtregelprogramma’s waarmee u – al naar gelang uw behoeften – socketservers en socketclients kunt gebruiken om gegevens van andere socket-enabled processen op te halen of te ontvangen.

Relaties zijn nooit gemakkelijk

De programma’s die we gaan gebruiken zijn: nc en ncat. Deze twee hulpprogramma’s hebben een vreemde relatie. De nc programma is een herschrijving van ncatdie veel ouder is dan nc . Maar ncat is ook herschreven, en het laat ons nu wat dingen doen nc kan niet. En er zijn veel implementaties van ncatdie zelf een afgeleide is van een tool genaamd netcat. Bovendien, op de meeste distributies, nc is een symbolische link naar ncat en geen apart programma.

We hebben recente Arch-, Manjaro-, Fedora- en Ubuntu-distributies gecontroleerd. De enige waarvoor de tools moesten worden geïnstalleerd, was Manjaro. Op Manjaro moet je de . installeren netcat pakket om te krijgen ncmaar je krijgt niet ncatJij krijgt netcat. En op Manjaro, nc is een symbolische link naar netcat.

sudo pacman -S netcat

Het netcat-pakket installeren op Manjaro

Waar het op neerkomt is, op Manjaro-gebruik netcat Als je het ziet ncat in de voorbeelden in dit artikel.

Luisteren op een stopcontact

Als software luistert naar inkomende socketverbindingen, fungeert het als een server. Alle gegevens die via de socketverbinding komen, zouden hebben ontvangen door de server. We kunnen dit gedrag heel gemakkelijk repliceren met behulp van nc. Alle ontvangen gegevens worden weergegeven in het terminalvenster.

We moeten het vertellen nc om naar verbindingen te luisteren, met behulp van de -l (luister) optie, en we moeten de poort specificeren waarop we naar verbindingen gaan luisteren. Alle clientprogramma’s of -processen die proberen verbinding te maken met dit exemplaar van nc moet dezelfde poort gebruiken. Wij vertellen nc op welke poort te luisteren met behulp van de -p (poort) optie.

Deze opdracht begint nc als socketserver, luisterend naar een verbinding op poort 6566:

nc -l -p 6566

nc starten als een socketserver

Terwijl het wacht op een inkomende verbinding, nc produceert geen output. Zodra een verbinding tot stand is gebracht, wordt alle opgehaalde informatie weergegeven in het terminalvenster. Hier is een verbinding gemaakt door een clientprogramma dat zichzelf identificeert als ‘client 1’.

nc gegevens ontvangen van een klant

Alles weergegeven door nc wordt ontvangen van de opdrachtgever. Deze klant stuurt toevallig zijn naam en een genummerd bericht met de tijd en datum.

Wanneer de klant de verbinding verbreekt, nc wordt beëindigd en u keert terug naar de terminalprompt.

nc beëindigd na een verbreking van de clientzijde

Gegevens naar een bestand verzenden

Om de gegevens van de klant in een bestand vast te leggen, kunnen we de uitvoer verzenden van: nc naar een bestand met behulp van omleiding. Deze opdracht slaat de ontvangen gegevens op in een bestand met de naam “logfile.txt”.

nc -l -p 6566 > logfile.txt

De uitvoer omleiden van nc naar een tekstbestand

Je zult geen uitvoer zien – het gaat in het bestand – en, paradoxaal genoeg, weet je niet of er een verbinding is gemaakt totdat nc eindigt. Terugkeren naar de opdrachtprompt geeft aan dat er een verbinding heeft plaatsgevonden en is beëindigd door de client.

We kunnen gebruiken less om de inhoud van het bestand “logfile.txt” te bekijken.

less logile.txt

Minder gebruiken om een ​​tekstbestand te onderzoeken

U kunt vervolgens door de gegevens bladeren en zoeken met de ingebouwde functies van minder.

Vastgelegde uitvoer van nc in minder bekijken

Gegevens naar een bestand en het terminalvenster verzenden

Als u de gegevens in het terminalvenster voorbij wilt zien scrollen en deze tegelijkertijd naar een bestand wilt laten verzenden, pijpt u de uitvoer van nc naar binnen tee .

nc -l -p 6566 | tee logfile.txt

Uitvoer van nc tegelijkertijd naar een bestand en naar het terminalvenster sturen

Meerdere verbindingen accepteren

Dat is allemaal prima, maar het heeft wel beperkingen. We kunnen maar één aansluiting accepteren. We zijn beperkt tot het ontvangen van gegevens van een enkele klant. Ook, wanneer die client de verbinding verbreekt, onze socketserver nc eindigt.

Als u meerdere verbindingen moet accepteren, moeten we gebruiken ncat. we zullen het moeten vertellen ncat om te luisteren en om een ​​bepaalde poort te gebruiken, net zoals we deden met nc. Maar we gebruiken ook de -k (keep alive) optie. Dit vertelt ncat om door te gaan en verbindingen van clients te accepteren, zelfs wanneer de laatste actieve verbinding wegvalt.

Dit betekent ncat wordt uitgevoerd totdat we ervoor kiezen om het te beëindigen met “Ctrl-C”. Nieuwe verbindingen worden geaccepteerd of: ncat is momenteel verbonden met alle clients of niet.

ncat -k -l -p 6566

luisteren naar meerdere verbindingen met ncat

We kunnen de gegevens van de verschillende clients zien verschijnen in de uitvoer van: ncat als ze verbinden.

Tweede en derde client die verbinding maken met ncat

Verbinding maken met een server

We kunnen ook gebruik maken van nc als socketclient en maak verbinding met een ander programma dat verbindingen accepteert en als server fungeert. In dit scenario, nc is de socket-client. Om dit te doen, moeten we vertellen: nc waar de serversoftware zich op het netwerk bevindt.

Een manier om dit te doen is door een IP-adres en een poortnummer op te geven. Als de server zich op dezelfde pc bevindt die we gebruiken nc aan, kunnen we het loopback-IP-adres van 127.0.0.1 gebruiken. Niet dat er geen vlaggen worden gebruikt om het serveradres en poortnummer aan te geven. We geven alleen de juiste waarden.

Om verbinding te maken met een server op dezelfde pc en poort 6566 te gebruiken, kunnen we het loopback-IP-adres gebruiken. Het te gebruiken commando is:

nc 127.0.0.1 6566

nc gebruiken als socketclient

gegevens die nc ophaalt van de server komt voorbij in het terminalvenster.

Gegevens ophalen van een socketserver met nc

Als u de netwerknaam weet van de computer waarop de serversoftware draait, kunt u die gebruiken in plaats van het IP-adres.

nc sulaco 6566

nc gebruiken om verbinding te maken met een socketserver met behulp van de pc-naam waarop de server draait

Gebruik “Ctrl+C” om een ​​verbinding te verbreken.

Snel en gemakkelijk

nc en ncat past bij de rekening wanneer u geen aangepaste socket-handler wilt schrijven, maar u gegevens moet verzamelen van een of andere socket-enabled bron. Door de uitvoer naar een bestand om te leiden, kunt u de uitvoer bekijken met lessen ontleden het bestand met behulp van hulpprogramma’s zoals grep.

Nieuwste artikelen

Gerelateerde artikelen