Comment lire les données d’un socket en Bash sous Linux ?

By Thomas GROLLEAU

La ligne de commande Linux vous permet de récupérer des données en écoutant sur un socket ou en vous connectant à un socket. Les données peuvent être capturées dans un fichier texte. Nous vous montrons comment faire.

Clients et serveurs de sockets

Les sockets permettent aux logiciels en réseau de communiquer. Elles ont été implémentées pour la première fois dans le système d’exploitation Unix 4.2BSD, créé à l’Université de Californie, Berkeley, en 1983. Elles ont été rapidement adoptées par System V Unix et Microsoft Windows.

Un socket est un point d’extrémité d’une connexion réseau logicielle, abstrait de manière à pouvoir être traité comme un handle de fichier. Cela signifie qu’il correspond au principe général de conception d’Unix et de Linux « tout est un fichier ». Nous ne parlons pas de la prise physique sur le mur dans laquelle vous branchez votre câble réseau.

Si un programme se connecte à une prise d’un autre logiciel, il est considéré comme le client de cet autre logiciel. Le logiciel qui permet à un autre logiciel de demander des connexions est appelé serveur. Ces termes sont utilisés indépendamment des autres utilisations de client et de serveur dans le monde informatique. Pour éviter toute confusion, ils sont parfois appelés client de socket et serveur de socket pour lever toute ambiguïté. Nous allons les appeler clients et serveurs.

Les sockets sont implémentés en tant qu’interface de programmation d’applications (API), ce qui permet aux développeurs de logiciels de faire appel à la fonctionnalité des sockets à partir de leur code. C’est très bien si vous êtes un programmeur, mais qu’en est-il si vous ne l’êtes pas ? Ou peut-être l’êtes-vous, mais votre cas d’utilisation ne justifie pas l’écriture d’une application ? Linux fournit des outils de ligne de commande qui vous permettent d’utiliser des serveurs et des clients de socket de base, en fonction de vos besoins, pour récupérer ou recevoir des données d’autres processus compatibles avec les sockets.

COMMENT UTILISER SET ET PIPEFAIL DANS LES SCRIPTS BASH SOUS LINUX

Les relations ne sont jamais faciles

Les programmes que nous allons utiliser sont nc et ncat. Ces deux utilitaires ont une relation étrange. Le programme nc est une réécriture de ncat, qui est beaucoup plus ancien que nc . Mais ncat a été réécrit aussi, et il nous permet maintenant de faire certaines choses que nc ne peut pas faire. Et il existe de nombreuses implémentations de ncat, qui est lui-même un dérivé d’un outil appelé netcat. En plus de cela, sur la plupart des distributions, nc est un lien symbolique vers ncat et non un programme séparé.

Nous avons vérifié les distributions récentes Arch, Manjaro, Fedora et Ubuntu. La seule qui nécessitait l’installation des outils était Manjaro. Sur Manjaro, vous devez installer le paquet netcat pour obtenir nc, mais vous n’obtenez pas ncat, vous obtenez netcat. Et sur Manjaro, nc est un lien symbolique vers netcat.

A lire également :   Comment enregistrer Gmail en PDF ?

sudo pacman -S netcat

Installer le paquet netcat sur Manjaro

En résumé, sur Manjaro, utilisez netcat lorsque vous voyez ncat dans les exemples de cet article.
Écoute d’un socket

Si un logiciel écoute les connexions socket entrantes, il agit comme un serveur. On dit que toutes les données qui arrivent sur la connexion socket sont reçues par le serveur. Nous pouvons reproduire ce comportement très facilement en utilisant nc. Toutes les données reçues sont affichées dans la fenêtre du terminal.

Nous devons dire à nc d’écouter les connexions, en utilisant l’option -l (listen), et nous devons spécifier le port sur lequel nous allons écouter les connexions. Tous les programmes ou processus clients qui essaient de se connecter à cette instance de nc doivent utiliser le même port. Nous indiquons à nc sur quel port il doit écouter en utilisant l’option -p (port).

Cette commande démarre nc en tant que serveur de socket, en écoutant une connexion sur le port 6566 :

nc -l -p 6566

Démarrer nc en tant que serveur de socket

Pendant qu’il attend une connexion entrante, nc ne produit aucune sortie. Une fois la connexion établie, toute information récupérée est affichée dans la fenêtre du terminal. Ici, une connexion a été établie par un programme client qui s’identifie comme « client 1 ».

nc reçoit des données d’un client

Tout ce qui est affiché par nc est reçu du client. Il se trouve que ce client envoie son nom, ainsi qu’un message numéroté contenant l’heure et la date.

Lorsque le client rompt sa connexion, nc se termine et vous êtes ramené à l’invite du terminal.

A lire également :   Métronome Google

nc se termine après une déconnexion du côté client

COMMENT VALIDER LA SYNTAXE D’UN SCRIPT BASH LINUX AVANT DE L’EXÉCUTER ?

Envoi de données vers un fichier

Pour capturer les données du client dans un fichier, nous pouvons envoyer la sortie de nc vers un fichier en utilisant la redirection. Cette commande enregistre les données reçues dans un fichier appelé « logfile.txt ».

nc -l -p 6566 > logfile.txt

Redirection de la sortie de nc vers un fichier texte

Vous ne verrez pas de sortie – elle va dans le fichier – et, paradoxalement, vous ne saurez pas si une connexion a eu lieu avant que nc ne se termine. Le fait d’être renvoyé à l’invite de commande indique qu’une connexion a eu lieu et a été interrompue par le client.

Nous pouvons utiliser less pour examiner le contenu du fichier « logfile.txt ».

less fichierjournal.txt

Utilisation de less pour examiner un fichier texte

Vous pouvez ensuite faire défiler les données, et effectuer des recherches en utilisant les fonctions intégrées de less.

Examen de la sortie capturée de nc dans less

Envoi de données vers un fichier et la fenêtre du terminal

Si vous voulez voir les données défiler dans la fenêtre du terminal et les envoyer dans un fichier en même temps, placez la sortie de nc dans tee .

nc -l -p 6566 | tee logfile.txt

Envoi de la sortie de nc dans un fichier et dans la fenêtre du terminal en même temps

Accepter les connexions multiples

Tout cela est bien, mais a des limites. Nous ne pouvons accepter qu’une seule connexion. Nous sommes limités à la réception de données d’un seul client. De plus, lorsque ce client interrompt la connexion, notre serveur de socket nc se termine.

Si vous avez besoin d’accepter des connexions multiples, nous devons utiliser ncat. Nous devrons dire à ncat d’écouter, et d’utiliser un port particulier, tout comme nous l’avons fait avec nc. Mais nous utiliserons également l’option -k (keep alive). Ceci indique à ncat de continuer à fonctionner et à accepter des connexions de clients même lorsque la dernière connexion active est interrompue.

A lire également :   Comment agrandir la fenêtre de zoom réduite

Cela signifie que ncat fonctionnera jusqu’à ce que nous choisissions de l’arrêter avec « Ctrl-C ». Les nouvelles connexions seront acceptées, que ncat soit actuellement connecté à un client ou non.

ncat -k -l -p 6566

écoute de connexions multiples avec ncat

Nous pouvons voir les données des différents clients apparaître dans la sortie de ncat au fur et à mesure de leur connexion.

Deuxième et troisième clients se connectant à ncat

Se connecter à un serveur

Nous pouvons également utiliser nc comme un client socket et nous connecter à un autre programme qui accepte les connexions, et qui agit comme un serveur. Dans ce scénario, nc est le client de socket. Pour ce faire, nous devons indiquer à nc où se trouve le logiciel serveur sur le réseau.

Une façon de le faire est de fournir une adresse IP et un numéro de port. Si le serveur est sur le même PC que celui sur lequel nous faisons tourner nc, nous pouvons utiliser l’adresse IP de bouclage de 127.0.0.1. Il n’y a pas de drapeaux utilisés pour indiquer l’adresse du serveur et le numéro de port. Nous fournissons simplement les valeurs appropriées.

Pour se connecter à un serveur sur le même PC, et utilisant le port 6566, nous pourrions utiliser l’adresse IP de bouclage. La commande à utiliser est la suivante

nc 127.0.0.1 6566

Utilisation de nc comme client de socket

Les données que nc récupère du serveur défilent dans la fenêtre du terminal.

Récupérer des données d’un serveur de socket avec nc

Si vous connaissez le nom de réseau de l’ordinateur qui exécute le logiciel serveur, vous pouvez l’utiliser à la place de l’adresse IP.

nc sulaco 6566

Utilisation de nc pour se connecter à un serveur de socket en utilisant le nom du PC sur lequel le serveur est exécuté

Utilisez « Ctrl+C » pour rompre une connexion.

Rapide et facile

nc et ncat conviennent parfaitement lorsque vous ne voulez pas écrire un gestionnaire de socket personnalisé, mais que vous avez besoin de collecter des données à partir d’une source compatible avec les sockets. Rediriger la sortie dans un fichier vous permet de revoir la sortie en utilisant less, et d’analyser le fichier en utilisant des utilitaires comme grep.

1 réflexion au sujet de « Comment lire les données d’un socket en Bash sous Linux ? »

Laisser un commentaire