"La Gaceta de Linux... ¡haciendo de Linux algo un poco más divertido!"


Jugar con el Adorable Netcat:
Reinventar /usr/bin/yes

Por zhaoway

Traducción al español por Lucas Maximiliano Sola
el día 2 de Mayo 2002, para La Gaceta de Linux


Netcat y Yescat

El primer y más importante propósito de este artículo es introducirle a usted esta ingeniosa herramienta de redes: /usr/bin/netcat la cual se encuentra disponible en Debian GNU/Linux dentro del paquete llamado netcat. (La instrucción: apt-get install netcat lo hará todo.) Existen muchos documentos bien escritos por el autor anónimo, y de los cuales surgen unas bien formateadas páginas del manual de Unix por parte de los desarrolladores amigos de Debian. Leer la documentación es realmente una experiencia interesante. Sin duda casi le recuerda al gentil lector que existe esta verdadera clase de criatura llamada gurú de Unix viviendo en algún lugar del planeta. Esa clase de sensación de hackeo, piénselo, hace hincapié en el éxito de permanecer anónimo, después de escribir tan buena pieza de software. ¡Sólo un verdadero gurú de Unix podría hacer eso!

Ya que la documentación de netcat es de excelente calidad, no la duplicaré aquí. (Sin embargo, le recomiendo que lea la documentación de netcat antes de leer este artículo.) Para aquellos de ustedes con poca paciencia, netcat puede reenviar corrientes de datos desde la entrada estándar hacia un socket TCP o UDP, y desde un socket TCP o UDP hacia la salida estándar. De la misma manera que el programa cat puede reenviar corrientes de datos desde la entrada estándar hacia la salida estándar. Según fuentes sin confirmar, ese es el origen del nombre del programa netcat.

El segundo propósito no tan primordial de este artículo es mostrarle a usted que tan tedioso e ingenuo puede ser el autor del artículo (yo), al introducirles una pieza de software la cual no posee interfaz de usuario gráfica, o algún sistema de ayuda interactiva. Ya saben, ¡simplemente me volvería loco si no pudiese capturar una o dos pantallas!

Por lo tanto aquí introducimos la loca herramienta yescat cuyo propósito se mostrará luego por si mismo: /usr/bin/yes. Apenas algunos la habrán notado. Pero yace silenciosamente en una esquina de /usr/bin desde hace mucho tiempo sin que ninguno de nosotros los recién llegados al mundo de Linux alguna vez nos dimos cuenta de que está en nuestro sistema. Su origen permanece un misterio. ¡Su popularidad es como la de /sbin/init! ¿Qué es lo que hace? Miremos con nuestros propios ojos:

zw@q ~ % yes
y
y
y
y
y
y
y

¿No es maravillosa? ;-) (Presione ctrl-c para detener las y, de lo contrario ellas marcharán hacia abajo por siempre en la pantalla.) ¡Incluso también puede decir no!

zw@q ~ % yes no
no
no
no
no
no

En las secciones siguientes desarrollaremos dos utilidades complementarias con las cuales eventualmente podremos reinventar /usr/bin/yes con la ayuda de /usr/bin/netcat ¡por supuesto! ¡Comencemos el viaje!

Hub y cable

Las utilidades hub (hub.c) y cable (cable.c) ciertamente están inspiradas por netcat el cual puede reenviar corrientes de datos desde un socket hacia la salida estándar, y desde la entrada estándar hacia un socket. ¿Olvidé recomendarles que lean la documentación que acompaña a netcat? ;-) Hub está diseñado para actuar como servidor, y cable está diseñado para actuar como cliente. En lugar de reenviar datos entre la Entrada/Salida estándar y un socket, hub y cable reenvían y multiplexan datos desde un socket hacia cualquier otro socket. De ahí es de donde salen los nombres. Ellos son como un hub y un cable de red. Veamos una captura de pantalla. ¡Sííí, capturas de pantalla! ;-)

zw@q ~ % ./hub
lullaby internetworks lab: (server alike) hub $Revision: 1.5 $
Copyright (C) 2001  zhaoway <zw@debian.org>

Usage: hub [hub buffer size] [tcp port number] [number of hub ports]

o hub buffer size is in bytes. for example 10240.
o tcp port number is at least 1024 so i do not need to be root.
o number of hub ports is at least 2. happy.
zw@q ~ %

Hub escuchará en un puerto TCP simulando un hub de red con muchos puertos. Los datos vienen desde un puerto del hub y serán reenviados hacia otros puertos del hub. Usted puede probar el hub por sí sólo sin la utilidad cable utilizando netcat. Nota: nc es el acrónimo de netcat.

  1. Lanzar hub desde la Consola A: ConA % ./hub 10240 10000 2
  2. Desde la Consola B, conectamos con netcat: ConB % nc localhost 10000
  3. Desde la Consola C, conectamos con otro netcat: ConC % nc localhost 10000
  4. Entonces usted puede escribir en la Consola C y leer la salida en la Consola B y vice versa.

Luego está cable:

zw@q ~ % ./cable
lullaby internetworks lab: (client alike) cable $Revision: 1.14 $
Copyright (C) 2001  zhaoway <zw@debian.org>

Usage: cable [cable buffer size] [1st ip] [1st port] [2nd ip] [2nd port] ..

o cable buffer size is in bytes. for example 10240.
o ports should be listening or connection attempts will fail.
o number of ip addr and port pairs is at least 2.
zw@q ~ %

Cable es más o menos como un cable coaxial de red. Reenvía y multiplexa datos entre los socket. Probémosla también.

  1. Lanzar un demonio de netcat en la Consola A: ConA % nc -l -p 10000
  2. Lanzar otro demonio de netcat en la Consola B: ConB % nc -l -p 10001
  3. Reglamentar el cable: ConC % ./cable 10240 127.0.0.1 10000 127.0.0.1 10001
  4. Entonces usted puede escribir en la Consola A y leer la salida en la Consola B, y vice versa.

Existen varias técnicas interesantes utilizadas en el desarrollo de hub y cable. Hay que destacar la llamada a la función select(). Pero por ahora, primero nos enfocaremos en nuestra aventura de reinventar /usr/bin/yes ;-)

Reinventar la rueda

No es una tarea simple reinventar /usr/bin/yes utilizando netcat, hub y cable. Tan sólo podría dar una respuesta tramposa. Y es por eso que necesito establecer el tamaño del buffer como un argumento en la línea de comandos. Pero de cualquier manera, ¡comencemos!

La idea principal es la siguiente. Primero configuramos un hub de tres puertos, luego utilizamos cable para conectar dos puertos del hub juntos, después de eso podemos utilizar netcat para repetir cualquier caracter dentro del puerto restante del hub. Es algo así como el siguiente diagrama:

            |            cable
           \|/        ,---------,
            |         |         |
            V         V         V
	,--[ ]-------[ ]-------[ ]--.
        |   A         B         C   |
        |    hub de tres puertos    |
	`---------------------------'

Debido a la naturaleza del hub, los datos enviados desde el puerto A, serán reenviados al puerto B y C, ya que los puertos B y C están conectados por un cable, los datos que salen del hub volverán a entrar de manera inmediata, y después de ser multiplexados y reenviados al puerto A y circularán en el bucle del cable por la eternidad. Eventualmente el puerto A recibirá infinitas copias de los datos originales que envió.

Construyamos el dispositivo.

  1. En la Consola A, lanzamos un hub de tres puertos: ConA % ./hub 10240 10000 3
  2. En la Consola B, ciclamos el cable: ConB % ./cable 10240 127.0.0.1 10000 127.0.0.1 10000

Ahora, después de que terminamos la construcción de nuestro dispositivo, entonces utilizaremos netcat para finalmente terminar nuestra reinvención de /usr/bin/yes.

ConC % echo "y" | nc localhost 10000
y
y
y
y
y
y

Los ejercicios mañosos que quedan para el lector son: ¿Qué pasa si cambiamos el tamaño del buffer en el hub y en el cable de 10240 a 1? Usted podría probarlo y verlo con sus propios ojos.

¡Diviértanse y buena suerte!

zhaoway

zhaoway vive en Nanjing, China. Él divide su tiempo entre su hermosa novia, su vieja computadora Pentium, y matemáticas puras. Ahora él quiere casarse, lo cual significa que necesita dinero, por ejemplo un trabajo. Siéntase libre de ayudarlo a llegar al dulce matrimonio al ofrecerle una oportunidad de trabajo. ¡Él estará muy agradecido! Además, él es otro miembro voluntario del proyecto Debian GNU/Linux.


Copyright © 2002, zhaoway.
Licencia de copiado http://www.linuxgazette.com/copying.html
Publicado en la Edición 74 de La Gaceta de Linux, Enero de 2002