Cat y amigos (Netcat y Socat)


linux

Introducción

En este artículo vamos a ver cómo usar cat, netcat y socat, al menos con algunos ejemplos básicos, y por qué tenemos tantos gatos…


Perdón por las grabaciones terribles, no pude descubrir por qué se ve tan mal con tmux.


cat

Como ya habrás adivinado o ya sabrás, cat es para con-cat-enar cosas. Cuando se usa junto con las redirecciones del shell, puede hacer muchas cosas poderosas, pero a menudo se usa cuando no es necesario. Veamos algunos ejemplos.

¿Qué pasó ahí? Básicamente, cuando querés terminar el archivo o la entrada, usás la combinación de teclas Ctrl+D, que cuando se teclea al inicio de una línea en una terminal, significa el final de la entrada. Esto no es una señal en el sentido de Unix: cuando una aplicación está leyendo desde la terminal y el usuario presiona Ctrl+D, la aplicación es notificada de que se ha alcanzado el final del archivo (como si estuviera leyendo desde un archivo y hubiera pasado el último byte). Esto también se puede usar para terminar sesiones de ssh o simplemente cerrar sesión en una terminal.


Si querés copiar y pegar algo, aquí lo tenés:


# Concatenación normal a stdout
cat test-1.txt test-2.txt 

# Creando un archivo (redirección)
cat > test-3.txt
Algunos contenidos ctrl-d

# Añadiendo al mismo archivo (misma redirección pero en modo de agregar)
cat >> test-3.txt
Más contenido ctrl-d

# Leyendo el archivo (leer y enviar a stdout)
cat test-3.txt

Aunque aquí cat está simplificado en exceso, puede hacer muchas cosas interesantes y usualmente se malusa mirá acá


Más info:


netcat

Netcat es un poco más interesante ya que puede usar la red y es muy simple también, te permite usar sockets de red sin demasiada complicación. Veamos un par de ejemplos: primero levantamos un servidor (listener), luego nos conectamos desde el otro lado y enviamos algunos datos. Tené en cuenta que las conexiones son bidireccionales, y luego con Ctrl-C terminamos el proceso. En el segundo ejemplo levantamos un servidor y esperamos que un archivo comprimido sea enviado desde el cliente.

Hay muchas más cosas que podés hacer con netcat y suele ser realmente útil para depurar problemas de red o hacer una copia rápida de archivos a través de la red.


Si querés copiar y pegar algo, acá lo tenés:

### Ejemplo uno
# Servidor
# -l significa escuchar, y -p para especificar el puerto
nc -l -p 3000
Escribí acá

# Cliente
# Esto no necesita mucha explicación: si no está escuchando, 
# necesita un host y un puerto para conectarse
nc localhost 3000
o escribí algo acá

# Ejemplo dos
# Servidor (Ejemplo copiando un archivo, se puede usar para copiar cualquier cosa que tar pueda enviar)
# Primero creamos una carpeta temporal, nos movemos a ella
# luego escuchamos con netcat y tubamos tar con xvf -
# eso significa que todo lo que venga de stdin
# será tratado como un archivo comprimido tar y descomprimido en el lugar
mkdir tmp && cd tmp && nc -l -p 3000 | tar xvf - 

# Cliente (envía el archivo)
# Creamos un archivo con algo de texto
echo "Hola mundo!" > test.txt
# Luego lo comprimimos con tar y lo imprimimos a stdout 
# también lo redirigimos a nc para que sea enviado por la red
# tar cvf es lo opuesto de tar xvf, x es extraer, v es verbose
# y f es archivo, c es comprimir
tar cvf - test.txt | nc localhost 3000

Netcat es bastante bueno en su trabajo y siempre es una buena herramienta para tener a mano, pero hay otras tareas más complejas con sockets, y para eso tenemos socat.


Más info:


socat

Socat es una utilidad de línea de comandos que establece dos flujos de bytes bidireccionales y transfiere datos entre ellos. Como los flujos pueden construirse a partir de un gran conjunto de diferentes tipos de fuentes y sumideros de datos (ver tipos de direcciones), y como se pueden aplicar muchas opciones de dirección a los flujos, socat se puede usar para muchos propósitos diferentes. Ese fragmento fue extraído de la página del manual, socat significa SOcket CAT y es un relay multipropósito. Vamos a ver algunos ejemplos para aclarar qué significa y algunas cosas interesantes para las que podés usar socat. Al principio puede parecer un poco intimidante, pero te aseguro que vale la pena aprender a usarlo.


Algo a tener en cuenta cuando usás socat es que necesita dos direcciones, a veces podés omitirlas con un -. Aunque socat tiene muchísimos más casos de uso que cat o netcat, solo te mostraré unos pocos, pero te dejaré algunos links por si te interesa aprender más. Lo que encuentro particularmente útil es la capacidad de hacer un port-forward en una sola línea.


Básicamente, con socat el límite es tu imaginación en cuanto a lo que podés hacer.


Si querés copiar y pegar algo, acá lo tenés:

# Ejemplo uno
# Redirigir un puerto o hacer un port-forward
# dado que `socat` siempre necesita dos direcciones (pueden ser sockets, lo que sea)
# necesitamos definir qué queremos hacer, en este caso
# le decimos que escuche en todas las interfaces en el puerto 2222 y fork
# eso significa que puede aceptar muchas conexiones (es como un multiplexor)
# luego le decimos que envíe lo que venga de ese socket a localhost y al puerto 22
# con el protocolo TCP
socat TCP-LISTEN:2222,fork TCP:localhost:22

# Socat como cliente 
# El cliente es más simple, simplemente ignoramos la primera dirección con -
# y solo usamos el remoto para conectarnos, como con netcat o telnet
socat - tcp:localhost:2222

# Ejemplo dos
# También se puede usar como nc -l -p puerto
# En este ejemplo vemos cómo podemos simular el comportamiento básico de netcat
# especificando la dirección local e ignorando la remota
socat TCP-LISTEN:2222,fork -

# Mismo cliente
socat - tcp:localhost:2222

# Ejemplo tres
# Sesión remota de bajo presupuesto
# Aquí escuchamos localmente en el puerto 2222 y, en cualquier conexión,
# lanzamos un shell bash con EXEC. ¡Una locura, no?
socat TCP-LISTEN:2223 EXEC:/bin/bash

# Mismo cliente 
socat - tcp:localhost:2223

# Ejemplo cuatro
# Túnel SSH
# En este escuchamos en el puerto 2224 y enviamos lo que venga 
# a la dirección 192.168.1.50 puerto 22 y protocolo TCP, en este caso es
# el puerto ssh de mi raspberry, así que es solo un túnel.
socat TCP-LISTEN:2224,reuseaddr,fork TCP:192.168.1.50:22

# Cliente SSH
# Luego te conectás normalmente a través del túnel.
ssh pi@localhost -p 2224

Más info:


Notas finales

Asegurate de revisar los links si querés aprender más sobre cada herramienta, y espero que lo hayas disfrutado. Nos vemos en twitter o github!


Errata

Si ves algún error o tenés alguna sugerencia, por favor mandame un mensaje así lo arreglo.



No tienes cuenta? Regístrate aqui

Ya registrado? Iniciar sesión a tu cuenta ahora.

Iniciar session con GitHub
Iniciar sesion con Google
  • Comentarios

    Online: 0

Por favor inicie sesión para poder escribir comentarios.

by Gabriel Garrido