Cum să citiți datele dintr-un socket în Bash pe Linux
Publicat: 2022-06-28Linia 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.
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
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
Î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”.
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.
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
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
Puteți apoi să parcurgeți datele și să căutați folosind funcțiile încorporate ale less.
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
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
Putem vedea datele de la diferiți clienți care apar în rezultatul de la ncat
pe măsură ce se conectează.
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
Datele pe care nc
le preia de pe server parcurg în fereastra terminalului.
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
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