#!/bin/bash #angeldp #buscaHosts.sh # Busca los equipos conectados a una LAN determinada (red pasada como # parámetro o pedida al usuario si no se pasa nada.) # Lista las IPs activas en la red y, opcionalmente, # crea un fichero de configuración para el clusterSsh con las IPs de # los equipos activos. clear # Si no se ha pasado nada como parámetro; o éste no es una IP # se la solicito de forma interactiva # La cutre comprobación lo que hace es sustituir los puntos # de la IP por espacios y luego contar las palabras. Si no # son 4, es que no ha pasado nada parecido a una IP y se la pido. if [ `echo $1 | tr \. ' ' | wc -w` != 4 ] then echo "Indique la dirección de red a escanear: " read IPvLAN else IPvLAN=$1 fi # Se deberá comprobar el contenido de IPvLAN, pero como el script es # para uso personal, ya me aseguraré de indicar un IP válida. # Lo que el script hará será escanear desde la dirección X.X.X.1 a la # X.X.X.254 buscando las IPs que estén activas. # Para hacerlo, primero guardo los 3 primeros octetos de la IP rangoIP=`echo $IPvLAN | cut -d. -f1-3` # Uso nmap para escanear el rango guardando las IPs activas en listaIPS echo "Escaneando la red..." listaIPS=`nmap -sP ${rangoIP}.1-254 | grep ${rangoIP}. | cut -d' ' -f5` # Quiero dar la opción de excluir alguna IP, como el gateway o el equipo # del profesor... echo "Señale, si lo desea, la lista de direcciones IP (separadas por comas) a ex cluir del listado. Pulse enter para no indicar ninguna" read whiteIPS # Construyo un bucle for que recorra las IPs activas, las compare con # la lista de excluidas, y, de no estarlo, las muestre y guarde en # el fichero clusters for IP in $listaIPS do # Para comprobar si una IP está en la lista de excluidas busco # en la lista esa IP y, si no la encuentra, la guardo como válida. AUX=`echo $whiteIPS | grep $IP` if [ -z $AUX ] then IPSaula="$IPSaula $IP" fi done # Muestro la lista echo -e "IPs asignadas en el rango ${rangoIP}.1-254:\n$IPSaula" # Pregunto si se desea generar un fichero clusters ssh con ellas echo "¿Desea generar un cluster con estas IPs? s/n" read -s -n1 OPC if [ "$OPC" = "s" -o "$OPC" = "S" ] then # Compruebo que se ha lanzado el script como root, ya que para # sobreescribir el archivo /etc/clusters es necesario. if [ $UID -ne 0 ] then echo "Para crear el cluster deber root." echo "sudo le puede ayudar la próxima vez." echo "Saliendo sin realizar cambios en /etc/clusters" exit fi # Como quiero abrir la conexión como root, añado la cadena root@ al # inicio de cada IP y las voy acumulando en listaCLUSTER for IP in $IPSaula do IP="root@${IP}" listaCLUSTER="$listaCLUSTER $IP" done # Pido el nombre del cluster y compruebo mediante la variable # CONTROL si existe una línea con el nombre proporcionado en el fichero # saldrá del bucle en el que pide el nombre del cluster solo cuando # no exista un cluster con ese nombre; o cuando se ha indicado que # se sobreescriba. (En esos casos pongo a 1 la variable CONTROL) CONTROL=0 while [ "$CONTROL" = "0" ] do clear read -p "Nombre para el cluster: " CLUSTER EXISTE=`grep ^$CLUSTER /etc/clusters` if [ -n $EXISTE ] then echo "Ya existe un cluster llamado $CLUSTER" read -n1 -s -p "¿Desea sobreescribirlo? s/n: " OPC2 if [ "$OPC2" = "s" -o "$OPC2" = "S" ] then CONTROL=1 fi else CONTROL=1 fi done # Una vez fuera del bucle, mando una copia del fichero /etc/clusters # sin la línea del cluster indicado (si existiera) al home del usuario grep -v ^$CLUSTER /etc/clusters > $HOME/clusters 2> /dev/null # Actualizo la información sobre la copia, y muevo esa # copia a su destino original, comprobando el error. echo "$CLUSTER $listaCLUSTER" >> $HOME/clusters mv $HOME/clusters /etc/clusters 2> /dev/null if [ $? -ne 0 ] then echo "Se ha producido un error." echo "en $HOME/clusters debería tener una copia del fichero clusters" exit fi echo "Hecho, el fichero /etc/clusters se ha actualizado " fi