Cat y amigos (Netcat y Socat)
- 17 linux
- 5 networking
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.
-
Comentarios
Online: 0
Por favor inicie sesión para poder escribir comentarios.