Come leggere i dati da un socket in Bash su Linux

Pubblicato: 2022-06-28
Codice binario che scorre attraverso cavi ottici.
XYZ/Shutterstock.com

La riga di comando di Linux ti consente di recuperare i dati ascoltando su un socket o collegandoti a un socket. I dati possono essere acquisiti in un file di testo. Ti mostriamo come.

Socket Client e Server

I socket consentono al software in rete di comunicare. Sono stati implementati per la prima volta nel sistema operativo Unix 4.2BSD, creato all'Università della California, Berkeley, nel 1983. Sono stati rapidamente adottati da System V Unix e Microsoft Windows.

Cosa significa "Tutto è un file" in Linux?
CORRELATI Cosa significa "Tutto è un file" in Linux?

Un socket è un endpoint di una connessione di rete software, astratto in modo che possa essere trattato come un handle di file. Ciò significa che si adatta al principio generale di progettazione Unix e Linux di "tutto è un file". Non intendiamo la presa fisica sul muro a cui colleghi il cavo di rete.

Se un programma si connette a un socket su un altro software, viene considerato il client dell'altro software. Il software che consente ad altri software di richiedere connessioni è chiamato server . Questi termini sono utilizzati indipendentemente da altri usi di client e server nel mondo IT. Per evitare confusione, a volte vengono chiamati client socket e server socket per rimuovere l'ambiguità. Li chiameremo client e server.

I socket sono implementati come un'interfaccia di programmazione dell'applicazione (API), consentendo agli sviluppatori di software di richiamare la funzionalità del socket dall'interno del loro codice. Va bene se sei un programmatore, ma se non lo sei? O forse lo sei, ma il tuo caso d'uso non giustifica la scrittura di un'applicazione? Linux fornisce strumenti a riga di comando che consentono di utilizzare, di base, server socket e client socket, in base alle proprie esigenze, per recuperare o ricevere dati da altri processi abilitati per socket.

CORRELATI: Che cos'è un'API e come li usano gli sviluppatori?

Le relazioni non sono mai facili

I programmi che useremo sono nc e ncat . Queste due utilità hanno una strana relazione. Il programma nc è una riscrittura di ncat , che è molto più vecchio di nc . Ma ncat è stato riscritto e ora ci consente di fare alcune cose che nc non può. E ci sono molte implementazioni di ncat , che a sua volta è un derivato di uno strumento chiamato netcat . Inoltre, sulla maggior parte delle distribuzioni, nc è un collegamento simbolico a ncat e non un programma separato.

Abbiamo controllato le recenti distribuzioni Arch, Manjaro, Fedora e Ubuntu. L'unico che richiedeva l'installazione degli strumenti era Manjaro. Su Manjaro, devi installare il pacchetto netcat per ottenere nc , ma non ottieni ncat , ottieni netcat . E su Manjaro, nc è un collegamento simbolico a netcat .

 sudo pacman -S netcat 

Installazione del pacchetto netcat su Manjaro

La conclusione è che su Manjaro usa netcat quando vedi ncat negli esempi in questo articolo.

Ascolto su una presa

Se il software è in ascolto per le connessioni socket in entrata, agisce come un server. Si dice che tutti i dati che arrivano attraverso la connessione socket siano ricevuti dal server. Possiamo replicare questo comportamento molto facilmente usando nc . Tutti i dati ricevuti vengono visualizzati nella finestra del terminale.

Dobbiamo dire a nc di ascoltare le connessioni, usando l'opzione -l (listen), e dobbiamo specificare la porta su cui ascolteremo le connessioni. Qualsiasi programma o processo client che tenta di connettersi a questa istanza di nc deve utilizzare la stessa porta. Diciamo a nc su quale porta ascoltare usando l'opzione -p (port).

Questo comando avvia nc come server socket, in attesa di una connessione sulla porta 6566:

 nc -l -p 6566 

a partire da nc come un server socket

Mentre attende una connessione in entrata, nc non produce alcun output. Una volta stabilita la connessione, tutte le informazioni recuperate vengono visualizzate nella finestra del terminale. Qui, è stata stabilita una connessione da un programma client che si identifica come "client 1".

nc ricevere dati da un client

Tutto quanto visualizzato da nc viene ricevuto dal client. Questo client invia il suo nome e un messaggio numerato contenente l'ora e la data.

Quando il client interrompe la connessione, nc termina e si torna al prompt del terminale.

nc terminato dopo una disconnessione dal lato client

Invio di dati a un file

Per acquisire i dati dal client in un file, possiamo inviare l'output da nc a un file utilizzando il reindirizzamento. Questo comando salva i dati ricevuti in un file chiamato "logfile.txt".

 nc -l -p 6566 > logfile.txt 

Reindirizzamento dell'output da nc a un file di testo

Non vedrai alcun output - sta entrando nel file - e, paradossalmente, non saprai se si è verificata una connessione fino a quando nc non termina. La restituzione al prompt dei comandi indica che si è verificata una connessione ed è stata interrotta dal client.

Possiamo usare less per rivedere il contenuto del file "logfile.txt".

 meno logile.txt 

Usare less per esaminare un file di testo

È quindi possibile scorrere i dati e cercare utilizzando le funzioni integrate di less.

Revisione dell'output acquisito da nc in meno

CORRELATI: Come utilizzare meno comando su Linux

Invio di dati a un file e alla finestra del terminale

Se vuoi vedere i dati scorrere nella finestra del terminale e inviarli contemporaneamente a un file, reindirizza l'output da nc a tee .

 nc -l -p 6566 | tee logfile.txt 

Invio di output da nc in un file e alla finestra del terminale contemporaneamente

Accettazione di connessioni multiple

Va tutto bene, ma ha dei limiti. Possiamo accettare solo una connessione. Siamo limitati a ricevere dati da un singolo cliente. Inoltre, quando quel client interrompe la connessione, il nostro server socket nc termina.

Se devi accettare più connessioni, dobbiamo usare ncat . dovremo dire a ncat di ascoltare e di utilizzare una porta particolare, proprio come abbiamo fatto con nc . Ma useremo anche l'opzione -k (keep alive). Questo dice a ncat di continuare a funzionare e accettare le connessioni dai client anche quando l'ultima connessione attiva cade.

Ciò significa che ncat verrà eseguito fino a quando non scegliamo di terminarlo con "Ctrl-C". Verranno accettate nuove connessioni indipendentemente dal fatto che ncat sia attualmente connesso a qualsiasi client o meno.

 ncat -k -l -p 6566 

ascolto di più connessioni con ncat

Possiamo vedere i dati dei diversi client che appaiono nell'output di ncat mentre si connettono.

Secondo e terzo client che si connettono a ncat

Connessione a un server

Possiamo anche usare nc come client socket e connetterci a un altro programma che accetta connessioni e funge da server. In questo scenario, nc è il client socket. Per fare ciò dobbiamo dire a nc dove si trova il software del server sulla rete.

Un modo per farlo è fornire un indirizzo IP e un numero di porta. Se il server si trova sullo stesso PC su cui stiamo eseguendo nc , possiamo utilizzare l'indirizzo IP di loopback di 127.0.0.1. Non che non ci siano flag usati per indicare l'indirizzo del server e il numero di porta. Forniamo solo i valori appropriati.

Per connetterci a un server sullo stesso PC e utilizzando la porta 6566, potremmo utilizzare l'indirizzo IP di loopback. Il comando da usare è:

 nc 127.0.0.1 6566 

Utilizzo di nc come client socket

I dati che nc recupera dal server scorrono nella finestra del terminale.

Recupero dati da un server socket con nc

Se si conosce il nome di rete del computer che esegue il software del server, è possibile utilizzarlo al posto dell'indirizzo IP.

 nc sulaco 6566 

Utilizzo di nc per connettersi a un server socket utilizzando il nome del PC su cui è in esecuzione il server

Usa "Ctrl+C" per interrompere una connessione.

Facile e veloce

nc e ncat soddisfano il conto quando non si desidera scrivere un gestore socket personalizzato, ma è necessario raccogliere dati da un'origine abilitata per socket. Reindirizzare l'output in un file consente di rivedere l'output utilizzando less e analizzare il file utilizzando utilità come grep .

CORRELATI: Come utilizzare il comando grep su Linux