Cómo leer datos de un socket en Bash en Linux

Código binario que fluye a través de cables ópticos.
XYZ/Shutterstock.com

La línea de comandos de Linux le permite recuperar datos escuchando en un socket o conectándose a un socket. Los datos se pueden capturar en un archivo de texto. Te mostramos cómo.

Clientes y servidores de socket

Los sockets permiten que el software en red se comunique. Se implementaron por primera vez en el sistema operativo 4.2BSD Unix , creado en la Universidad de California, Berkeley, en 1983. Rápidamente fueron adoptados por System V Unix y Microsoft Windows.

Un socket es un punto final de una conexión de red de software, abstraído para que pueda tratarse como un identificador de archivo. Eso significa que encaja con el principio de diseño general de Unix y Linux de » todo es un archivo «. No nos referimos al enchufe físico en la pared en el que conectas tu cable de red.

Si un programa se conecta a un socket en otra pieza de software, se considera que es el  cliente  del otro software. El software que permite que otro software solicite conexiones se denomina  servidor . Estos términos se usan independientemente de otros usos de cliente y servidor en el mundo de TI. Para evitar confusiones, a veces se denominan  cliente de socket  y  servidor de socket  para eliminar la ambigüedad. Los llamaremos clientes y servidores.

Los sockets se implementan como una interfaz de programación de aplicaciones (API) , lo que permite a los desarrolladores de software llamar a la funcionalidad del socket desde su código. Eso está bien si eres programador, pero ¿y si no lo eres? ¿O tal vez lo es, pero su caso de uso no justifica escribir una aplicación? Linux proporciona herramientas de línea de comandos que le permiten usar servidores de socket básicos y clientes de socket, según sus necesidades, para recuperar o recibir datos de otros procesos habilitados para socket.

Relacionado:  ¿Qué es una batería de grafeno y cómo transformará la tecnología?

Las relaciones nunca son fáciles

Los programas que vamos a utilizar son ncy ncat. Estas dos utilidades tienen una extraña relación. El ncprograma es una reescritura de ncat, que es mucho más antiguo que nc. Pero ncattambién se ha reescrito, y ahora nos permite hacer algunas cosas ncque no podemos. Y hay muchas implementaciones de ncat, que a su vez es un derivado de una herramienta llamada netcat. Además de eso, en la mayoría de las distribuciones , nchay un enlace simbólico ncaty no un programa separado.

Revisamos las distribuciones recientes de Arch, Manjaro , Fedora y Ubuntu . El único que requirió la instalación de las herramientas fue Manjaro. En Manjaro, necesita instalar el netcatpaquete para obtener nc, pero no obtiene ncat, obtiene netcat. Y en Manjaro, nchay un enlace simbólico a netcat.

sudo pacman -S netcat

Instalación del paquete netcat en Manjaro

La conclusión es, sobre el uso de Manjaro netcatcuando se ve ncaten los ejemplos de este artículo.

Escuchar en un socket

Si el software escucha las conexiones de socket entrantes, está actuando como un servidor.  Se dice que el servidor recibe cualquier dato que llegue a través de la conexión de socket  . Podemos replicar este comportamiento muy fácilmente usando nc. Todos los datos recibidos se muestran en la ventana del terminal.

Necesitamos decirle nca escuchar las conexiones, usando la -lopción (escuchar), y necesitamos especificar el puerto en el que vamos a escuchar las conexiones. Cualquier programa o proceso cliente que intente conectarse a esta instancia ncdebe usar el mismo puerto. Le decimos ncen qué puerto escuchar usando la -popción (puerto).

Este comando comienza nccomo un servidor de socket, escuchando una conexión en el puerto 6566:

nc -l -p 6566

iniciar nc como servidor de socket aa

Mientras espera una conexión entrante, ncno produce ningún resultado. Una vez que se establece una conexión, cualquier información recuperada se muestra en la ventana del terminal. Aquí, un programa cliente ha realizado una conexión que se identifica como «cliente 1».

Relacionado:  Cómo encontrar descargas en un Chromebook

nc recibir datos de un cliente

Todo lo que se muestra por ncse recibe del cliente. Este cliente envía su nombre y un mensaje numerado que contiene la hora y la fecha .

Cuando el cliente interrumpe su conexión, ncfinaliza y vuelve al indicador de terminal.

nc terminó después de una desconexión del lado del cliente

Envío de datos a un archivo

Para capturar los datos del cliente en un archivo, podemos enviar la salida nc a un archivo mediante la redirección. Este comando guarda los datos recibidos en un archivo llamado «logfile.txt».

nc -l -p 6566 > archivo de registro.txt

Redirigir la salida de nc a un archivo de texto

No verá ningún resultado (va al archivo) y, paradójicamente, no sabrá si se ha producido una conexión hasta que ncfinalice. Volver al símbolo del sistema indica que se ha producido una conexión y que el cliente la ha terminado.

Podemos usarless para revisar el contenido del archivo “logfile.txt”.

menos logile.txt

Uso de less para examinar un archivo de texto

Luego puede desplazarse por los datos y buscar usando las funciones integradas de less.

Revisar la salida capturada de nc en menos

Envío de datos a un archivo y la ventana de terminal

Si desea ver los datos desplazándose por la ventana del terminal y enviarlos a un archivo al mismo tiempo, canalice la salida desde nca tee.

nc -l -p 6566 | tee logfile.txt

Envío de salida desde nc a un archivo y a la ventana del terminal al mismo tiempo

Aceptar múltiples conexiones

Todo eso está bien, pero tiene limitaciones. Solo podemos aceptar una conexión. Estamos limitados a recibir datos de un solo cliente. Además, cuando ese cliente pierde la conexión, nuestro servidor de socket nc finaliza.

Si necesita aceptar varias conexiones, debemos usar ncat. tendremos que indicarle ncatque escuche y que use un puerto en particular, tal como lo hicimos con nc. Pero también usaremos la -kopción (mantener vivo). Esto le indica ncatque siga ejecutándose y aceptando conexiones de clientes incluso cuando se cae la última conexión activa.

Relacionado:  Cómo eliminar una cuenta de Gmail de iPhone y iPad

Este medio ncatse ejecutará hasta que decidamos terminarlo con “Ctrl-C”. Se aceptarán nuevas conexiones ya sea que ncatesté conectado actualmente a algún cliente o no.

ncat -k -l -p 6566

escuchando múltiples conexiones con ncat

Podemos ver los datos de los diferentes clientes que aparecen en la salida a ncatmedida que se conectan.

Segundo y tercer clientes que se conectan a ncat

Conexión a un servidor

También podemos usarlo nccomo cliente de socket y conectarnos a otro programa que esté aceptando conexiones, y esté actuando como servidor. En este escenario, nces el cliente de socket. Para hacer esto, necesitamos indicar ncdónde se encuentra el software del servidor en la red.

Una forma de hacerlo es proporcionar una dirección IP y un número de puerto. Si el servidor está en la misma PC en la que estamos ejecutando nc, podemos usar la dirección IP de bucle invertido de 127.0.0.1. No es que no se utilicen banderas para indicar la dirección del servidor y el número de puerto. Solo proporcionamos los valores apropiados.

Para conectarnos a un servidor en la misma PC y usando el puerto 6566, podríamos usar la dirección IP de loopback. El comando a utilizar es:

nc 127.0.0.1 6566

Usando nc como un cliente de socket

Los datos que ncse recuperan del servidor se desplazan por la ventana del terminal.

Recuperación de datos de un servidor de socket con nc

Si conoce el nombre de red de la computadora que ejecuta el software del servidor, puede usarlo en lugar de la dirección IP.

nc sulaco 6566

Usando nc para conectarse a un servidor de socket usando el nombre de la PC en la que se está ejecutando el servidor

Utilice «Ctrl+C» para romper una conexión.

Rapido y Facil

ncy ncatse ajusta a la factura cuando no desea escribir un controlador de socket personalizado, pero necesita recopilar datos de alguna fuente habilitada para socket. Redirigir la salida a un archivo le permite revisar la salida usando lessy analizar el archivo usando utilidades como grep.