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!
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.
ConA % ./hub 10240 10000 2
ConB % nc localhost 10000
ConC % nc localhost 10000
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.
ConA % nc -l -p 10000
ConB % nc -l -p 10001
ConC % ./cable 10240 127.0.0.1 10000 127.0.0.1 10001
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 ;-)
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.
ConA % ./hub 10240 10000 3
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 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.
zhaoway
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