Navegando por la red, he encontrado un script muy curioso, que valida direcciones IP. Es bastante simple, lo que hace es validar una dirección ip, pasada, diciéndonos que es good o que es bad, dependiendo de si es o no válida o no.
El script lo he encontrado mientras buscaba el tratamiento de arrays en bash, y como hay mal que por bien no venga, aquí vamos a ponerlo para no olvidarnos.
#!/bin/bash
# Validar IPs:
# Uso:
# valid_ip IP_ADDRESS
# if [[ $? -eq 0 ]]; then echo good; else echo bad; fi
# OR
# if valid_ip IP_ADDRESS; then echo good; else echo bad; fi
#
function valid_ip()
{
local ip=$1
local stat=1
if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
OIFS=$IFS
IFS=’.’
ip=($ip)
IFS=$OIFS
[[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \
&& ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
stat=$?
fi
return $stat
}
# If run directly, execute some tests.
if [[ “$(basename $0 .sh)” == ‘valid_ip’ ]]; then
ips=’
4.2.2.2
a.b.c.d
192.168.1.1
0.0.0.0
255.255.255.255
255.255.255.256
192.168.0.1
192.168.0
1234.123.123.123
‘
for ip in $ips
do
if valid_ip $ip; then stat=’good’; else stat=’bad’; fi
printf “%-20s: %s\n” “$ip” “$stat”
done
fi
Si guardas el script como “valid_ip.sh” y lo ejecutas directamente, arrancará algunos tests y mostrará el resultado:
# sh valid_ip.sh
4.2.2.2 : good
a.b.c.d : bad
192.168.1.1 : good
0.0.0.0 : good
255.255.255.255 : good
255.255.255.256 : bad
192.168.0.1 : good
192.168.0 : bad
1234.123.123.123 : bad
En la función valid_ip, el if usa expresiones regulares para asegurarse que las direcciones están compuestas por 4 grupos de números separados por puntos:
if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
Si se pasa esta comprobación, el script, separará la dirección en 4 bloques y meterá las 4 partes en un array:
OIFS=$IFS
IFS=’.’
ip=($ip)
IFS=$OIFS
El elemento usado para el parseo es el punto “.” Poniendo el valor de cada uno de los bloques en una matriz y se comprobará que todos sean menores a 255, y almacena el resultado:
[[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \
&& ${ip[2]} -le 255 && ${ip[3]} -le 255 ]]
stat=$?
No es necesario probar que los números son mayores o igual a cero porque la expresión regular de prueba ya ha eliminado cualquier cosa que no sean sólo puntos y dígitos.
Cargando...