6 de marzo de 2010

Script para comprobar la conexión lan

Hace algunos días tuve problemas para navegar por internet por era causa de los DNS que no respondian y se me ocurrió hacer un script que compruebe la conexión tanto del host, del router como de los DNS que tenga configurados. Esta información la recopila a patir de los comandos: ifconfig, route y del archivo de configuración "/etc/resolv.conf"; por lo que son necesarios permisos de root para poder ejecutarlo.

Una vez ha recuperado dicha información y la ha confirmado el usuario, se pasa a un bucle for que lanza un paquete ICMP (ping -c 1) a las direcciones que comprobar. Las respuestas se guardan en un archivo temporal con el que filtrar los resultados: parquetes enviados y recibidos, perdidos, etc... Se crea un segundo archivo temporal que muestra por pantalla los resultados obtenidos según la opción que se eliga.

Por último, prueba la resolución de nombres lanzando nuevamente un paquete ping al dominio www.google.es o al dominio que espeficiquemos nosotros.

Esto solamente es una idea, tengo en mente que se pueda especificar el direccionamiento del equipo para aplicarlo y hacer pruebas. También hacer una lista con los DNS de varios ISP para incorporarlo al bucle y que pruebe la conexión hasta dichos equipos; entre otras cosas mas: consola nslookup, dig, nmap¿?...

El código es:
#!/bin/bash
#
# SCRIPT TO CHECK YOURS CONECTIONS
#
function net {
        ipl=`ifconfig | grep -E "inet[^6]" | grep -v 127| awk '{print $2}' | sed s/[a-zA-Z:]*//`
        msk=`ifconfig | grep -E "inet[^6]" | grep -v 127 | awk '{print $4}' | sed s/[a-zA-Z:]*//`
        gtw=`route | grep default | awk '{print $2}'`
        int=`route | grep default | awk '{print $8}'`
        dns1=`cat /etc/resolv.conf | grep -v "#" | grep -n "" | grep "1:" | awk '{print $2}'`
        dns2=`cat /etc/resolv.conf | grep -v "#" | grep -n "" | grep "2:" | awk '{print $2}'`
}
#
function conect {
        for i in $ipr; do
         ping -c 1 $i > temp
         ip=`cat temp | grep -oE "PING [0-9.]+" | awk '{print $2}'`
         env=`cat temp | grep -oE "[0-9]+ packets transmitted" | awk '{print $1}'`
         rec=`cat temp | grep -oE "[0-9]+ received" | awk '{print $1}'`
         per=`cat temp | grep -oE "[0-9]+% packet loss" | awk '{print $1}'`
         los=`expr $env - $rec`
         echo -e "IP destino: $ip"
         echo -e "Paquetes enviados: $env"
         echo -e "Paquetes recibidos: $rec"
         echo -e "Paquetes perdidos: $los"
         echo -e "Perdidas: $per"
         if [[ `cat temp | grep -oE "[0-9]+% packet loss" | awk '{print $1}' | sed s/\%//` == 0 ]]; then
             echo -e OK
         else
             echo -e OPS!
         fi
         echo -e "-----------------------"
        done
}
#
net
echo -ne "Creo que esta es tu configuracion de red:\n\tInterfaz: $int\n\tIP: $ipl\n\tMascara: $msk\n\tGateway: $gtw\n\tDNS 1: $dns1\n\tDNS 2: $dns2\nEs correcto (s/n): "
read resp
if [[ $resp == s || $resp == S ]]; then
    ipr=`echo "$ipl $gtw $dns1 $dns2"`
elif [[ $resp == n || $resp == N ]]; then
    echo -e "Hasta otra..."
    exit 1
else
    echo -e "Debes responder si o no... vuelve a internarlo ;)"
    exit 1
fi
clear
echo -e "Probando conectividad..."
conect > temp2
echo -ne "RESULTADOS:\n-----------\n\t1) $int\n\t2) $gtw\n\t3) $dns1\n\t4) $dns2\n\t*) Cualquier otra tecla para verlos todos\nElige el numero asociado al resultado que quieras ver: "
read report
case $report in
    1)
      clear
      cat temp2 | grep -A 5 `echo $ipl`
      ;;
    2)
      clear
      cat temp2 | grep -A 5 `echo $gtw`
      ;;
    3)
      clear
      cat temp2 | grep -A 5 `echo $dns1`
      ;;
    4)
      clear
      cat temp2 | grep -A 5 `echo $dns2`
      ;;
    *)
      clear
      more temp2
      ;;
esac
echo -e "\nQuieres probar la resolucion de nombres?\nEscribe la pagina web con la que quieras comprobar los servidores DNS\n[www.google.es]"
read resp
if [ -z $resp ]; then
    ping -c 1 www.google.es > temp
elif [ $resp = `echo $resp | grep -oE "www\.[a-z.]+\.[a-z.][a-z.]+"` ]; then
    ping -c 1 $resp > temp
else
    ping -c 1 www.google.es > temp
fi
echo -e "Ping a: `cat temp | grep -oE "PING www\.[a-z.]+\.[a-z.][a-z.]+" | awk '{print $2}'`"
echo -e "Perdidas: `cat temp | grep -oE "[0-9]+% packet loss" | awk '{print $1}'`"
if [[ `cat temp | grep -oE "[0-9]+% packet loss" | awk '{print $1}' | sed s/\%//` == 0 ]]; then
    echo -e OK
else
    echo -e OPS!
fi
rm -rf temp*
exit 0
#
#Fve
El script como no, se licencia bajo GPLv3. Un saludo, Brixton Cat ;)

PD: Si alguien tiene algún problema con el script o porque no se entienda bien por el formato del blog, no duden en comentar o pedir una copia del mismo.

Crear Live-USB de BackTrack 4 con PlayFullDrive

Hace tiempo que no escribo una entrada dado que ultimamente estoy liado todo el día con algún editor de texto y una consola en la que probar scripts... En la última versión del script que tengo entre manos, PlayFullDrive beta 0.2.1, se puede utilizar la última release de BackTrack, BackTrack 4 Final.

Dado que BackTrack 4 utiliza GRUB como cargador de arranque y yo utilizo Syslinux para dicha función a la hora de crear los lives, esta distribución tiene ligeras diferencias con el resto de lives compatibles con el script. Por poner algún ejemplo, el archivo de configuración "menu.lst", la imagen splash "bt4.xpm.gz", etc... Por ello, debemos de modificar dichos archivos para que puedan trabajar con Syslinux.

Inicialmente deberemos lanzar el script como si de otra live se tratase y como se lanzan todos los scripts: lo descargamos, descomprimimos y lanzamos.

wget http://sourceforge.net/projects/playfulldrive/files/playfulldrive0.2.1.tar.gz
tar xvfz playfulldrive0.2.1.tar.gz
chmod +x playfulldrive0.2.1.sh
./playfulldrive0.2.1.sh

En la pantalla inicial, se nos muestran tres opciones para elegir: predefinidas, local e internet. Para nuestro caso, podemos tanto elegir la primera como la segunda teniendo en cuenta que para las imagenes predefinidas, se descargará una imagen de la distribución al menos que en el mismo directorio ya contemos con ella.


Una vez hemos descargado o indicado la ruta de la imagen iso a utilizar, nos pide que introduzcamos la unidad usb para ser reconocida y formateada. Cuando la unidad está lista, monta el usb y la imagen en dos carpetas temporales desde la que copiar los archivos a la unidad. Es posible que muestre varios fallos con algunas distribuciones pero después arranca la unidad y se trabajar con el live.



Utilizando "bt4-final.iso" como nombre del archivo de imagen, mostrará un mensaje anunciando que son necesarios los archivos de arranque antes de desmontar las unidades y finalizar el script. Dichos archivos están disponibles en la url:

http://sourceforge.net/projects/playfulldrive/files/boot_backtrack.tar.gz

y contienen la imagen splash, el archivo de configuración syslinux.cfg y el archivo vesamenu.c32, un kernel para crear menus de arranque interactivos.

En el archivo "doc-bt4.txt", adjuntado en la última versión del paquete, se detalla el proceso de creación de dichos archivos. Éste, también está disponible en la url:

http://sourceforge.net/projects/playfulldrive/files/doc-bt4.txt

Un saludo, Brixton Cat ;)