Проверить действительность IP - программирование
Подтвердить что ты не робот

Проверить действительность IP

Как проверить правильность IP-адреса в оболочке script, которая находится в диапазоне от 0.0.0.0 до 255.255.255.255?

4b9b3361

Ответ 1

Если вы используете bash, вы можете выполнить простое сопоставление регулярных выражений для шаблона, не проверяя четырехугольники:

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

Если вы застряли в оболочке POSIX, то вы можете использовать expr чтобы сделать то же самое, используя BRE вместо 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

Обратите внимание, что expr предполагает, что ваше регулярное выражение привязано к левой части строки, поэтому начальный ^ не нужен.

Если важно убедиться, что для каждого четырехугольника меньше 256, вам, очевидно, потребуется больше кода:

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

Или, возможно, даже с меньшим количеством труб:

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

Или, опять же, если ваша оболочка bash, вы можете использовать громоздкое регулярное выражение для проверки квадратов, если вам не нравится арифметика:

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

Это также может быть выражено в BRE, но это больше печатать, чем у меня в пальцах.

И наконец, если вам нравится идея поместить эту функциональность... в функцию:

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

Есть много способов сделать это. Я показал вам всего несколько.

Ответ 2

Использовать ipcalc

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

Ответ 3

Сценарий проверки IP-адреса в скрипте Bash от Mitch Frazier делает то, что вы хотите сделать:

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
}

Ответ 4

Типичные решения для всего этого, похоже, используют регулярные выражения, но мне кажется, что это может быть лучший подход, чтобы сделать что-то вроде:

if echo "$ip" | { IFS=. read a b c d e;
    test "$a" -ge 0 && test "$a" -le 255 &&
    test "$b" -ge 0 && test "$b" -le 255 &&
    test "$c" -ge 0 && test "$c" -le 255 &&
    test "$d" -ge 0 && test "$d" -le 255 &&
    test -z "$e"; }; then echo is valid; fi

Ответ 5

Это одно регулярное выражение должно проверять только те адреса между 0.0.0.0 и 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

Ответ 6

Я нашел ниже скрипт ЗДЕСЬ, который мне очень понравился.

#!/bin/bash

# Test an IP address for validity:
# Usage:
#      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
}

Ответ 7

Я изменил все коды и нашел, что это полезно.

#!/bin/bash

ip="256.10.10.100"

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

Ответ 8

Perl имеет отличный модуль Regexp:: Common для проверки различных вещей:

perl -MRegexp::Common=net -e 'exit(shift() !~ /^$RE{net}{IPv4}$/)' $ipaddr

Возможно, вам понадобится sudo cpan install Regexp::Common first

Я бы обернул его в функцию:

valid_ip() {
  perl -MRegexp::Common=net -e 'exit(shift() !~ /^$RE{net}{IPv4}$/)' "$1"
}

if valid_ip 123.234.345.456; then
  echo OK
else
  echo INVALID
fi

Ответ 9

#!/bin/bash
read -p " ip: " req_ipadr
#
ip_full=$(echo $req_ipadr | sed -n 's/^\(\(\([1-9][0-9]\?\|[1][0-9]\{0,2\}\|[2][0-4][0-9]\|[2][5][0-4]\)\.\)\{3\}\([1-9][0-9]\?\|[1][0-9]\{0,2\}\|[2][0-4][0-9]\|[2][5][0-4]\)\)$/\1/p')
#
[ "$ip_full" != "" ] && echo "$req_ipadr vaild ip" || echo "$req_ipadr invaild ip"

Ответ 10

Я предпочитаю использовать ipcalc для этого, если мой скрипт не должен быть переносимым.

ipcalc 1.1.1.355                                                                         
INVALID ADDRESS: 1.1.1.355

Address:   192.168.1.1          11000000.10101000.00000001. 00000001
Netmask:   255.255.255.0 = 24   11111111.11111111.11111111. 00000000
Wildcard:  0.0.0.255            00000000.00000000.00000000. 11111111
=>
Network:   192.168.1.0/24       11000000.10101000.00000001. 00000000
HostMin:   192.168.1.1          11000000.10101000.00000001. 00000001
HostMax:   192.168.1.254        11000000.10101000.00000001. 11111110
Broadcast: 192.168.1.255        11000000.10101000.00000001. 11111111
Hosts/Net: 254                   Class C, Private Internet

Здесь есть отличная страница, показывающая, как использовать ее в сценариях и т.д. Здесь: SleeplessBeastie Notes

Ответ 11

Вы можете просто скопировать следующий код и изменить тело элемента управления if else в соответствии с вашими потребностями

function checkIP(){
echo "Checking IP Integrity"    
ip=$1
byte1='echo "$ip"|xargs|cut -d "." -f1'
byte2='echo "$ip"|xargs|cut -d "." -f2'
byte3='echo "$ip"|xargs|cut -d "." -f3'
byte4='echo "$ip"|xargs|cut -d "." -f4'


if [[  $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$  && $byte1 -ge 0 && $byte1 -le 255 && $byte2 -ge 0 && $byte2 -le 255 && $byte3 -ge 0 && $byte3 -le 255 && $byte4 -ge 0 && $byte4 -le 255 ]]
then
    echo "IP is correct"
else
    echo "This Doesn't look like a valid IP Address : $ip" 
fi
}
checkIP $myIP 

Вызов метода с IP-адресом, хранящимся в переменной с именем myIP.

$ ip = ~ ^ [0-9] {1,3}. [0-9] {1,3}. [0-9] {1,3}. [0-9] {1,3} $ - Эта часть гарантирует, что IP состоит из 4 блоков, разделенных точкой (.), Но каждый блок здесь может иметь диапазон от 0 до 999

Поскольку желаемый диапазон каждого блока будет 0 - 255, можно убедиться, что нижняя строка может быть использована.

$ byte1 -ge 0 && $ byte1 -le 255 && $ byte2 -ge 0 && $ byte2 -le 255 && $ byte3 -ge 0 && $ byte3 -le 255 && $ byte4 -ge 0 && $ байт4 -le 255