martes, 22 de junio de 2010

Bash Scripting: Recursive Search inside text files

Anteriormente había tenido la necesidad de hacer búsquedas recursivas de alguna cadena, en todos los archivos de texto de un árbol de directorios. Un ejemplo típico es un parámetro o valor usado por algún aplicativo y que no recordamos claramente en que archivo de conflagración esta, en este contexto es donde personalmente he tenido la necesidad de una herramienta así.

Les quiero compartir un script que realiza precisamente este tipo de búsquedas, este script bien se puede adaptar para realizar operaciones sobre estos archivos, permisos, modificaciones, borrados, etc. Sin embargo eso ya queda de tarea de acuerdo a sus necesidades.


#!/bin/bash

if [ "$#" != "1" ]; then
echo "usage: finder ";
exit 1;
fi

#Se consigue un listado recursivo de los archivos en el directorio actual y subdirectorios
du -a * | awk 'BEGIN{"pwd" | getline LOCAL_PATH}{print LOCAL_PATH "/" $2}' | (
#Hacemos la lectura "filebyfile" o "linebyline"
while read line; do
#Solo buscamos en archivos de texto
file $line | grep text > /dev/null;
if [ "$?" -eq "0" ]; then
echo "*** Archivo de texto: $line";
cat $line | grep $1;
echo "";
fi
done
);
exit 0;

miércoles, 2 de junio de 2010

PackETH, Builder of RAW TCP/IP Packet

Hace algunos meses encontre en los repositorios de Ubuntu, una herramienta para la construcción de paquetes TCP/IP, el PackETH. Durante mis épocas de estudiante hacíamos pruebas personalizando paquetes con raw sockets en lenguaje C (¿que..., hay otro?). El desarrollo con raw sockets a pesar de fácil, puede ser en algún momento un poco confuso, sobre todo por los nombres de los elementos de las estructuras de datos usadas y su respectiva referencia y/o relación con el TCP/IP.
A modo de presentación de esta herramienta, se realizaron unas pruebas en una topología tan simple como la que muestra la figura anterior, una red local y un servidor de internet. En la computadora de la red local tenemos la dirección MAC 90:4C:E5:63:71:C9 y la dirección de red 192.168.1.100, los detalles pueden observar en la siguiente imagen.
Usando el PackETH, construimos un paquete ICMP, dirigido a un servidor de google. Haciendo un paréntesis, debemos saber que cuando un paquete cruza parcialmente la nube de internet y pasa por varios routers, en cada salto algunos campos se comportan de la siguiente manera:
  • MAC Origen: En cada salto cambia y es sustituida por el dispositivo que esta enviando o reenviando la trama, colocando su propia MAC Address.
  • MAC Destino: En cada salto cambia y es sustituida por el dispositivo que esta enviando o reenviando la trama, colocando la MAC Address del equipo que recibe la trama y que esta dentro de su segmento.
  • IP Origen: Solo llega a cambiar cuando salimos de alguna red local y el gateway hace un enmascaramiento, sustituyendo la IP origen que le llega por la que tiene el propio Gateway.
  • IP Destino: Nunca cambia!.
Conociendo la información anterior, seguimos con la instrucción del paquete, llenado los campos de la siguiente manera. Una vez terminado definimos la interfaz de salida, y damos clic a "Send". El paquete en ese momento es liberado en la ostil y lenta, red publica. Para verificar la entrega del paquete, podemos consultar algún sniffer, en este caso nos apoyamos de wireshark, donde podemos ver que el paquete se envía y recibe correctamente. Espero esta información puede ser de mucha ayuda para algunas personas.