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

Publicado: 2022-06-28
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.

¿Qué significa "Todo es un archivo" en Linux?
RELACIONADO ¿Qué significa "Todo es un archivo" en Linux?

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 API y cómo la usan los desarrolladores?

Las relaciones nunca son fáciles

Los programas que vamos a utilizar son nc y ncat . Estas dos utilidades tienen una extraña relación. El programa nc es una reescritura de ncat , que es mucho más antiguo que nc . Pero ncat también se ha reescrito y ahora nos permite hacer algunas cosas que nc no puede. 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, nc es un enlace simbólico a ncat y 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, debe instalar el paquete netcat para obtener nc , pero no obtiene ncat , obtiene netcat . Y en Manjaro, nc es un enlace simbólico a netcat .

 sudo pacman -S netcat 

Instalación del paquete netcat en Manjaro

La conclusión es que en Manjaro use netcat cuando vea ncat en 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 a nc que escuche las conexiones, usando la opción -l (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 de nc debe usar el mismo puerto. Le decimos a nc en qué puerto escuchar usando la opción -p (puerto).

Este comando inicia nc como un servidor de socket, escuchando una conexión en el puerto 6566:

 nc -l -p 6566 

comenzando nc como un servidor de socket

Mientras espera una conexión entrante, nc no 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".

nc recibir datos de un cliente

Todo lo que muestra nc se 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, nc finaliza 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 de nc a un archivo usando 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 nc finalice. Volver al símbolo del sistema indica que se ha producido una conexión y que el cliente la ha terminado.

Podemos usar less 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

RELACIONADO: Cómo usar el comando less en Linux

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 de nc a 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 termina.

Si necesita aceptar múltiples conexiones, necesitamos usar ncat . necesitaremos decirle a ncat que escuche y que use un puerto en particular, tal como lo hicimos con nc . Pero también usaremos la opción -k (mantener vivo). Esto le dice a ncat que siga ejecutándose y aceptando conexiones de clientes incluso cuando se cae la última conexión activa.

Esto significa que ncat se ejecutará hasta que decidamos terminarlo con "Ctrl-C". Se aceptarán nuevas conexiones ya sea que ncat esté actualmente conectado 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 de ncat a medida que se conectan.

Segundo y tercer clientes que se conectan a ncat

Conexión a un servidor

También podemos usar nc como cliente de socket y conectarnos a otro programa que acepte conexiones y actúe como servidor. En este escenario, nc es el cliente de socket. Para hacer esto, debemos decirle a nc dó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 loopback 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 nc recupera 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

nc y ncat ajustan 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 less y analizar el archivo usando utilidades como grep .

RELACIONADO: Cómo usar el comando grep en Linux