GNU/Linux >> Znalost Linux >  >> Linux

Zkontrolujte platnost IP

Použít ipcalc (testováno s balíčkem verze v RPM initscripts-9.49.49-1)

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

Tento jediný regulární výraz by měl ověřovat pouze adresy mezi 0.0.0.0 a 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

Pokud používáte bash, můžete pro vzor provést jednoduchou shodu regulárního výrazu, aniž byste museli ověřovat čtveřice:

#!/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

Pokud jste uvízli u shellu POSIX, můžete použít expr dělat v podstatě to samé, používat BRE místo 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

Všimněte si, že expr předpokládá, že váš regulární výraz je ukotven na levé straně řetězce, takže počáteční ^ je zbytečné.

Pokud je důležité ověřit, že každá čtveřice je menší než 256, budete samozřejmě potřebovat další kód:

#!/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

Nebo možná dokonce s menším počtem trubek:

#!/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

Nebo znovu, pokud je váš shell bash, můžete použít těžkopádný regulární výraz pro ověření quad, pokud nemáte rádi aritmetiku:

#!/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

Dalo by se to vyjádřit i v BRE, ale to je víc psaní, než mám v prstech.

A konečně, pokud se vám líbí myšlenka vložení této funkce ... do funkce:

#!/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

Můžete to udělat mnoha způsoby. Ukázal jsem vám jen několik.


Skript Ověření IP adresy ve skriptu Bash od Mitche Fraziera dělá to, co chcete:

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. Účel klíčového slova „dělat“ v Bash For Loops?

  2. Dotaz na seznam serverů pro přidělenou paměť/cpu?

  3. Co znamenají speciální postavy v Echo {a..z}?

  1. Zkontrolujte, zda existuje proměnná v seznamu v Bash

  2. zkontrolujte, zda je argument platným datem v bash shellu

  3. fsck:Možnosti pro nejdůkladnější kontrolu disku

  1. Jak zkontrolovat velké soubory v konzole

  2. Zkontrolovat proces, pokud je stejný?

  3. Existuje jedna vložka ke kontrole souboru?