Cum să citiți datele dintr-un socket în Bash pe Linux

Publicat: 2022-06-28
Cod binar care curge prin cabluri optice.
XYZ/Shutterstock.com

Linia de comandă Linux vă permite să preluați date fie ascultând pe un socket, fie conectându-vă la un socket. Datele pot fi captate într-un fișier text. Vă arătăm cum.

Socket Clienti si Servere

Prizele permit software-ului în rețea să comunice. Ele au fost implementate pentru prima dată în sistemul de operare 4.2BSD Unix, care a fost creat la Universitatea din California, Berkeley, în 1983. Au fost adoptate rapid de System V Unix și Microsoft Windows.

Ce înseamnă „Totul este un fișier” în Linux?
RELATE Ce înseamnă „Totul este un fișier” în Linux?

Un socket este un punct final al unei conexiuni de rețea software, abstractizat astfel încât să poată fi tratat ca un handle de fișier. Asta înseamnă că se potrivește cu principiul general de proiectare Unix și Linux de „totul este un fișier”. Nu ne referim la priza fizică de pe perete la care conectați cablul de rețea.

Dacă un program se conectează la o soclu de pe o altă bucată de software, acesta este considerat client al celuilalt software. Software-ul care permite altor programe să solicite conexiuni se numește server . Acești termeni sunt utilizați independent de alte utilizări ale clientului și serverului în lumea IT. Pentru a evita confuzia, acestea sunt uneori numite socket client și socket server pentru a elimina ambiguitatea. Le vom numi clienți și servere.

Socket-urile sunt implementate ca o interfață de programare a aplicațiilor (API), permițând dezvoltatorilor de software să apeleze la funcționalitatea socket-ului din codul lor. Este în regulă dacă ești programator, dar dacă nu ești? Sau poate că ești, dar cazul tău de utilizare nu justifică scrierea unei aplicații? Linux oferă instrumente de linie de comandă care vă permit să utilizați - de bază - servere socket și clienți socket, în funcție de nevoile dvs., pentru a prelua sau primi date de la alte procese activate cu socket.

LEGATE: Ce este un API și cum le folosesc dezvoltatorii?

Relațiile nu sunt niciodată ușoare

Programele pe care le vom folosi sunt nc și ncat . Aceste două utilități au o relație ciudată. Programul nc este o rescrie a lui ncat , care este mult mai vechi decât nc . Dar ncat a fost și el rescris și acum ne permite să facem unele lucruri pe care nc nu le poate. Și există multe implementări ale ncat , care în sine este un derivat al unui instrument numit netcat . În plus, în majoritatea distribuțiilor, nc este o legătură simbolică către ncat și nu un program separat.

Am verificat distribuțiile recente Arch, Manjaro, Fedora și Ubuntu. Singurul care necesita instalarea instrumentelor a fost Manjaro. Pe Manjaro, trebuie să instalați pachetul netcat pentru a obține nc , dar nu obțineți ncat , obțineți netcat . Și pe Manjaro, nc este o legătură simbolică către netcat .

 sudo pacman -S netcat 

Instalarea pachetului netcat pe Manjaro

Concluzia este că pe Manjaro folosește netcat când vezi ncat în exemplele din acest articol.

Ascultând pe o priză

Dacă software-ul ascultă conexiunile socket de intrare, acesta acționează ca un server. Se spune că orice date care vin prin conexiunea socket sunt primite de server. Putem replica acest comportament foarte ușor folosind nc . Orice date primite sunt afișate în fereastra terminalului.

Trebuie să îi spunem lui nc să asculte pentru conexiuni, folosind opțiunea -l (ascultare) și trebuie să specificăm portul pe care urmează să ascultăm conexiunile. Orice program sau proces client care încearcă să se conecteze la această instanță de nc trebuie să utilizeze același port. Îi spunem nc pe ce port să asculte folosind opțiunea -p (port).

Această comandă pornește nc ca un server socket, ascultând o conexiune pe portul 6566:

 nc -l -p 6566 

pornind nc ca un server socket

În timp ce așteaptă o conexiune de intrare, nc nu produce nicio ieșire. Odată realizată o conexiune, orice informație preluată este afișată în fereastra terminalului. Aici, o conexiune a fost realizată de un program client care se identifică ca „client 1”.

nc primirea datelor de la un client

Tot ceea ce este afișat de nc este primit de la client. Acest client se întâmplă să-și trimită numele și un mesaj numerotat care conține ora și data.

Când clientul își întrerupe conexiunea, nc se termină și veți reveni la promptul terminalului.

nc terminat după o deconectare de la partea clientului

Trimiterea datelor la un fișier

Pentru a captura datele de la client într-un fișier, putem trimite rezultatul de la nc la un fișier folosind redirecționare. Această comandă salvează datele primite într-un fișier numit „logfile.txt”.

 nc -l -p 6566 > logfile.txt 

Redirecționarea ieșirii de la nc la un fișier text

Nu veți vedea nicio ieșire - va intra în fișier - și, paradoxal, nu veți ști dacă a avut loc o conexiune până când nc se termină. Revenirea la promptul de comandă indică o conexiune care a avut loc și a fost întreruptă de client.

Putem folosi less pentru a revizui conținutul fișierului „logfile.txt”.

 mai puțin logic.txt 

Folosind mai puțin pentru a examina un fișier text

Puteți apoi să parcurgeți datele și să căutați folosind funcțiile încorporate ale less.

Revizuirea ieșirii capturate de la nc în mai puțin

LEGATE: Cum să utilizați comanda less pe Linux

Trimiterea datelor la un fișier și la fereastra terminalului

Dacă doriți să vedeți datele derulând în fereastra terminalului și să le trimiteți într-un fișier în același timp, transmiteți ieșirea de la nc în tee .

 nc -l -p 6566 | tee logfile.txt 

Trimiterea ieșirii de la nc într-un fișier și la fereastra terminalului în același timp

Acceptarea conexiunilor multiple

Totul este în regulă, dar are limitări. Putem accepta doar o singură conexiune. Ne limităm la primirea datelor de la un singur client. De asemenea, atunci când acel client renunță la conexiunea, serverul nostru de socket nc se termină.

Dacă trebuie să acceptați mai multe conexiuni, trebuie să folosim ncat . va trebui să îi spunem lui ncat să asculte și să folosească un anumit port, la fel cum am făcut cu nc . Dar vom folosi și opțiunea -k (păstrați în viață). Acest lucru îi spune ncat să continue să ruleze și să accepte conexiuni de la clienți chiar și atunci când ultima conexiune activă scade.

Aceasta înseamnă că ncat va rula până când alegem să-l încheiem cu „Ctrl-C”. Conexiunile noi vor fi acceptate indiferent dacă ncat este conectat în prezent la vreun client sau nu.

 ncat -k -l -p 6566 

ascultând conexiuni multiple cu ncat

Putem vedea datele de la diferiți clienți care apar în rezultatul de la ncat pe măsură ce se conectează.

Al doilea și al treilea client care se conectează la ncat

Conectarea la un server

De asemenea, putem folosi nc ca client socket și ne putem conecta la un alt program care acceptă conexiuni și acționează ca un server. În acest scenariu, nc este clientul socket. Pentru a face acest lucru, trebuie să spunem lui nc unde se află software-ul serverului în rețea.

O modalitate de a face acest lucru este să furnizați o adresă IP și un număr de port. Dacă serverul se află pe același computer pe care rulăm nc , putem folosi adresa IP loopback de 127.0.0.1. Nu că nu există indicatori folosiți pentru a indica adresa serverului și numărul portului. Oferim doar valorile adecvate.

Pentru a vă conecta la un server de pe același computer și folosind portul 6566, am putea folosi adresa IP de loopback. Comanda de utilizat este:

 nc 127.0.0.1 6566 

Folosind nc ca client socket

Datele pe care nc le preia de pe server parcurg în fereastra terminalului.

Preluarea datelor de pe un server socket cu nc

Dacă cunoașteți numele de rețea al computerului care rulează software-ul server, îl puteți utiliza în locul adresei IP.

 nc sulaco 6566 

Folosind nc pentru a vă conecta la un server socket folosind numele PC-ului pe care rulează serverul

Folosiți „Ctrl+C” pentru a întrerupe o conexiune.

Rapid și Ușor

nc și ncat se potrivesc atunci când nu doriți să scrieți un handler de socket personalizat, dar trebuie să adunați date dintr-o sursă activată pentru socket. Redirecționarea rezultatului într-un fișier vă permite să revizuiți rezultatul folosind less și să analizați fișierul folosind utilitare precum grep .

LEGATE: Cum să utilizați comanda grep pe Linux