Tabla de contenidos
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.
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 nc
programa 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 nc
que 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 , nc
hay un enlace simbólico 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, necesita instalar el netcat
paquete para obtener nc
, pero no obtiene ncat
, obtiene netcat
. Y en Manjaro, nc
hay un enlace simbólico a netcat
.
sudo pacman -S netcat
La conclusión es, sobre el uso de Manjaro netcat
cuando se ve 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 nc
a escuchar las conexiones, usando la -l
opció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 nc
debe usar el mismo puerto. Le decimos nc
en qué puerto escuchar usando la -p
opción (puerto).
Este comando comienza nc
como un servidor de socket, escuchando una conexión en el puerto 6566:
nc -l -p 6566
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».
Todo lo que se muestra por 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.
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
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 usarless
para revisar el contenido del archivo “logfile.txt”.
menos logile.txt
Luego puede desplazarse por los datos y buscar usando las funciones integradas de less.
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 nc
a tee
.
nc -l -p 6566 | tee logfile.txt
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 ncat
que escuche y que use un puerto en particular, tal como lo hicimos con nc
. Pero también usaremos la -k
opción (mantener vivo). Esto le indica ncat
que siga ejecutándose y aceptando conexiones de clientes incluso cuando se cae la última conexión activa.
Este medio ncat
se ejecutará hasta que decidamos terminarlo con “Ctrl-C”. Se aceptarán nuevas conexiones ya sea que ncat
esté conectado actualmente a algún cliente o no.
ncat -k -l -p 6566
Podemos ver los datos de los diferentes clientes que aparecen en la salida a ncat
medida que se conectan.
Conexión a un servidor
También podemos usarlo nc
como cliente de socket y conectarnos a otro programa que esté aceptando conexiones, y esté actuando como servidor. En este escenario, nc
es el cliente de socket. Para hacer esto, necesitamos indicar 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 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
Los datos que nc
se recuperan del servidor se desplazan por la ventana del terminal.
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
Utilice «Ctrl+C» para romper una conexión.
Rapido y Facil
nc
y ncat
se 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 less
y analizar el archivo usando utilidades como grep
.