socat es una utilidad que permite establecer una comunicación bidireccional entres dos canales. El canal de comunicación puede ser pipes, sockets tcp o udp, conexiones raw, líneas serie o sockets en el sistema de ficheros. Es una navaja suiza para transmitir flujos de bytes.
Cuando se compila socat intentará utilizar las librerias OpenSSL, readline y libwrap si están presentes en el sistema. Para detectarlas se usa el script de configure. En caso de no querer usarse, existen una serie de opciones de configure (--disable-openssl, --disable-readline, --disable-libwrap) para desactivar su uso. Puede verse más información en el README que acompaña al código fuente del programa. Puede compilarse de manera sencilla con:
# Descargar la última versión disponible
# de socat/download
wget http://www.dest-unreach.org/socat/download/socat-1.7.3.0.tar.gz
# Comprobar al suma md5
# (consultar aquí las actuales)
# En el caso del fichero socat-1.7.3.0.tar.gz es de46e3f726f783271226eb94d5109bf8
md5sum socat-1.7.3.0.tar.gz
# Descomprimir, compilar e instalar
tar zxvf socat-1.7.3.0.tar.gz
cd socat-1.7.3.0
./configure --prefix=/usr/local
make
# Como root instalar
make install
Si el proceso de compilación e instalación terminan correctamente los binarios del programa se habrán instalado en /usr/local/bin.
Para usar el programa:
socat [opciones] [addr0] [addr1]
Tras ejecutar la orden:
- Analizará las opciones de la línea de comandos.
- Abrirá los canales de comunicación indicados por las especificaciones de dirección addr0 y luego addr1
- Pasará la información entre los canales abiertos.
Las especificaciones de dirección tiene la forma de CLAVE:opciones,[opciones,...]: Una palabra clave separada por ":" y las opciones que necesite dicha dirección separada por ",". Ejemplo TCP-LISTEN:5000 va a abrir un puerto TCP en escucha en el puerto 5000, STDOUT o "-" va a usar la salida estándar , TCP:host:port se va a conectar a través de TCP a host:port. Con estos comandos se puede probar la comunicación.Se va a usar dos procesos de socat: uno lee de la entrada estándar, lo envía a través del puerto 5000 TCP a localhost y otro escucha las conexiones, recibe la información y la imprime.
# El servidor
socat -u TCP-LISTEN:5000 STDOUT
# El cliente
socat -u STDIN TCP:127.0.0.1:5000
En el ejemplo anterior, se usa la opción -u porque queremos una comunicación unidireccional desde la addr0 (el socket, la entrada estándar) hacía la otra dirección. Si quisiéramos una comunicación bidireccional, tb se podría hacer, pero ahora vamos a usar STDIO como sustituto de STDION y STDOUT y eliminado la opción -u. Se arranca de nuevo el server, y con independencia de la terminal en la que se escriba, podemos transmitir información entre las dos ventanas.
Como se están usando sockets TCP para la comunicación, cuando el proceso que está escuchando se para, automáticamente termina el proceso hijo.
Otro ejemplo: Supongamos que se desea tener un fichero de logs, por ejemplo, /var/log/system.log (en OS X, este fichero necesita permisos de admin para verse) disponible en un puerto de TCP para poder ver su contenido. Para ello se arranca un server en el puerto 5000 que volcará el contenido y un cliente que leerá el fichero desde el final y lo mandará al server
# El servidor
socat -u TCP-LISTEN:5000 STDOUT
# El cliente socat -u OPEN:/var/log/system.log,rdonly=1,seek-end=0,ignoreeof TCP:localhost:5000
Se abriendo el fichero (OPEN:/var/log/system.log), como sólo lectura (rdonly=1), posicionándose al final del mismo (seek-end=0) e ignorando el fin del fichero (ignoreof). Los datos que se leen se están mandando por TCP a localhost:5000. Básicamente esta orden es el equicalente a un tail -f a través de red en el puerto 5000. Puede verse en la siguiente captura su uso - y algunos errores de las pruebas ;) -.
No hay comentarios:
Publicar un comentario