Как проверить правильность IP-адреса в оболочке script, которая находится в диапазоне от 0.0.0.0
до 255.255.255.255
?
Проверить действительность IP
Ответ 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