Come leggere i dati da un socket in Bash su Linux
Pubblicato: 2022-06-28La 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.
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
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
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".
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.
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
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
È quindi possibile scorrere i dati e cercare utilizzando le funzioni integrate di less.
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
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
Possiamo vedere i dati dei diversi client che appaiono nell'output di ncat
mentre si connettono.
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
I dati che nc
recupera dal server scorrono nella finestra del terminale.
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
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