GNU/Linux >> Tutoriales Linux >  >> Linux

Comprobar la validez de la IP

Use ipcalc (probado con el paquete de versión en RPM initscripts-9.49.49-1)

$ ipcalc -cs 10.10.10.257 && echo vaild_ip || echo invalid_ip
invalid_ip

Esta expresión regular única debe validar solo aquellas direcciones entre 0.0.0.0 y 255.255.255.255:

#!/bin/bash

ip="1.2.3.4"

if [[ "$ip" =~ ^(([1-9]?[0-9]|1[0-9][0-9]|2([0-4][0-9]|5[0-5]))\.){3}([1-9]?[0-9]|1[0-9][0-9]|2([0-4][0-9]|5[0-5]))$ ]]; then
  echo "success"
else
  echo "fail"
fi

Si está utilizando bash, puede hacer una simple coincidencia de expresiones regulares para el patrón, sin validar los quads:

#!/usr/bin/env bash

ip=1.2.3.4

if [[ $ip =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
  echo "success"
else
  echo "fail"
fi

Si está atascado con un shell POSIX, entonces puede usar expr para hacer básicamente lo mismo, usando BRE en lugar de ERE:

#!/bin/sh

ip=1.2.3.4

if expr "$ip" : '[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*$' >/dev/null; then
  echo "success"
else
  echo "fail"
fi

Tenga en cuenta que expr asume que su expresión regular está anclada al lado izquierdo de la cadena, por lo que el ^ inicial es innecesario.

Si es importante verificar que cada cuádruple sea inferior a 256, obviamente necesitará más código:

#!/bin/sh

ip=${1:-1.2.3.4}

if expr "$ip" : '[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*$' >/dev/null; then
  for i in 1 2 3 4; do
    if [ $(echo "$ip" | cut -d. -f$i) -gt 255 ]; then
      echo "fail ($ip)"
      exit 1
    fi
  done
  echo "success ($ip)"
  exit 0
else
  echo "fail ($ip)"
  exit 1
fi

O quizás incluso con menos tuberías:

#!/bin/sh

ip=${1:-1.2.3.4}

if expr "$ip" : '[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*\.[0-9][0-9]*$' >/dev/null; then
  IFS=.
  set $ip
  for quad in 1 2 3 4; do
    if eval [ \$$quad -gt 255 ]; then
      echo "fail ($ip)"
      exit 1
    fi
  done
  echo "success ($ip)"
  exit 0
else
  echo "fail ($ip)"
  exit 1
fi

O nuevamente, si su shell es bash, podría usar una expresión regular engorrosa para la validación cuádruple si no le gusta la aritmética:

#!/usr/bin/env bash

ip=${1:-1.2.3.4}

re='^(0*(1?[0-9]{1,2}|2([0-4][0-9]|5[0-5]))\.){3}'
 re+='0*(1?[0-9]{1,2}|2([‌​0-4][0-9]|5[0-5]))$'

if [[ $ip =~ $re ]]; then
  echo "success"
else
  echo "fail"
fi

Esto también podría expresarse en BRE, pero eso es más tipeo de lo que tengo en mis dedos.

Y por último, si te gusta la idea de poner esta funcionalidad... en una función:

#!/usr/bin/env bash

ip=${1:-1.2.3.4}

ipvalid() {
  # Set up local variables
  local ip=${1:-1.2.3.4}
  local IFS=.; local -a a=($ip)
  # Start with a regex format test
  [[ $ip =~ ^[0-9]+(\.[0-9]+){3}$ ]] || return 1
  # Test values of quads
  local quad
  for quad in {0..3}; do
    [[ "${a[$quad]}" -gt 255 ]] && return 1
  done
  return 0
}

if ipvalid "$ip"; then
  echo "success ($ip)"
  exit 0
else
  echo "fail ($ip)"
  exit 1
fi

Hay muchas maneras de hacer esto. Te he mostrado solo algunos.


El script Validating an IP Address in a Bash Script de Mitch Frazier hace lo que usted quiere hacer:

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
}

Linux
  1. Cómo buscar archivos grandes en la consola

  2. ¿Cuál es el propósito de la palabra clave "do" en Bash For Loops?

  3. ¿Consulta la lista de servidores para la memoria/cpu asignada?

  4. ¿Existe un delineador para verificar el archivo?

  5. Comprobar la base de datos en busca de corrupción

Cómo comprobar (escanear) los puertos abiertos en Linux

Cómo comprobar los puertos de escucha en Linux (Puertos en uso)

Tutorial de comandos echo de Linux para principiantes (5 ejemplos)

¿Comprobar el proceso si se está ejecutando lo mismo?

¿Qué significan los caracteres especiales en Echo {a..z}?

Cómo buscar openCV en Ubuntu 9.10