2010-08-26 5 views
0

мой вопрос, я хочу, чтобы получить некоторые короткие и умные идеи, чтобы проверить IP-адрес, то мой примерсценарий оболочки + короткий синтаксис для проверки действительный IP

Может быть, некоторые Perl синтаксис, который я могу объединить в моем КШ сценарии

lidia

ответ

1

Не изобретайте велосипед.

use strict; 
use warnings; 
use Regexp::Common qw/net/; 
# see http://search.cpan.org/dist/Regexp-Common/lib/Regexp/Common/net.pm 

my $Address = '...'; 
# adapted from the module's synopsis 
for ($Address) { 
    /$RE{net}{IPv4}/  and print "Dotted decimal IP address"; 
    /$RE{net}{IPv4}{hex}/ and print "Dotted hexadecimal IP address"; 
    /$RE{net}{IPv4}{oct}{-sep => ':'}/ and 
          print "Colon separated octal IP address"; 
    /$RE{net}{IPv4}{bin}/ and print "Dotted binary IP address"; 
    /$RE{net}{MAC}/  and print "MAC address"; 
    /$RE{net}{MAC}{oct}{-sep => " "}/ and 
          print "Space separated octal MAC address"; 
} 

Используйте тот, который вам нужен.

Если вы не можете установить модуль, просто проскочите через код модуля и получите правильное регулярное выражение, в зависимости от того, какой IP-адрес вы хотите сопоставить.

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

Используя его из сценария оболочки будет вдоль линий:

return perl -e'use Regexp::Common qw/net/;$ip=shift;if ($ip =~ /$RE{net}{IPv4}/){exit 0}else{exit 1}' "$Address"; 

выше будет заменить полный «случай» блок.

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

+0

не хорошо мне нужен этот синтаксис как часть моего сценария оболочки – lidia

+0

читать бит «Если вы не можете установить модуль ... ": просто прочитайте код модуля и используйте правильное регулярное выражение для того, что вы хотите. Если вы хотите, я обновлю его с регулярным выражением для IPv4 – mfontani

1
check(){ 
    case "$1" in 
    [0-9]|[0-9][0-9]|[0-1][0-9][0-9]|2[0-4][0-9]|25[0-5]) echo "0";; 
    *) echo "1";; 
    esac 
} 
ip="$1" 
OIFS="$IFS" 
IFS="." 
set -- $ip 
result="$(check $1)$(check $2)$(check $3)$(check $4)" 
case "$result" in 
    "0000") echo "IP $ip Ok";; 
    *) echo "IP $ip not ok";; 
esac 
IFS="$OLDIFS" 
+1

Не работает почти треть диапазона 0-255 (например, 106 и 239). Почему бы не сделать: 'check() {case" $ 1 "в [0-9] | [0-9] [0-9] | [0-2] [0-9] [0-9]) (($ 1 > = 0 && $ 1 <= 255)) && echo "0" || echo "1" ;; *) echo "1" ;; ESAC; } ', чтобы проверить, что есть только цифры и что они попадают в правильный диапазон? –

+0

Вы правы. добавлено больше проверок. Не идет с целым методом сравнения. – ghostdog74

0

Bash> = версия 3.2 (это можно было бы сократить до значительно):

valid() { 
    if [[ $1 =~ ^[[:digit:]]+$ ]] && 
     (($1 >= 0 && $1 <= 255)) 
    then 
     echo "0" 
     return 0 
    else 
     echo "1" 
     return 1 
    fi 
} 

saveIFS=$IFS 
IFS='.' 
ip=($1) 
IFS=$saveIFS 
for octet in ${ip[@]} 
do 
    if ! valid $octet > /dev/null 
    then 
     valid=1 
    fi 
done 
[[ $valid != 1 ]] && echo "Good address" || echo "Bad address" 
+0

ip = ($ 1) не действителен в ksh – lidia

1

Split адрес, не касаясь СИФ и избежать сложных проверок путем побитового сдвига:

declare -a part=(${ip//\./ }) 
declare -i valid=0 

for p in ${part[@]}; do 
    if [[ $p =~ ^[[:digit:]]+$ ]] ; then 
    ((valid += p>>8)) 
    else 
    ((valid++)) 
    fi 
done 

if [ $valid -eq 0 ] ; then 
    echo -e "$ip  OK" 
else 
    echo -e "$ip NOT OK" 
fi 
+0

, как этот скрипт знает, если число превышает 255, потому что 256 num is not valid number – lidia

+0

этот скрипт не работает в ksh – lidia

0

Здесь это более короткий и простой способ сделать это. Он проверяет только базовую структуру, но в некоторых случаях этого достаточно.

VALID=$(echo $IP | egrep '^[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}$'); 

if [ ! -n "$VALID" ]; then 
    echo "This IP ($IP) isn't valid. Please check it and try again."; 
    exit 0; 
fi; 
0

сохранить адрес внутрибрюшинно в ip_server и проверить его, используя следующий код:

if [[ "$ip_server" =~ ^([0-9]{1,3})[.]([0-9]{1,3})[.]([0-9]{1,3})[.]([0-9]{1,3})$ ]] 
then 
    for ((i=1; i<${#BASH_REMATCH[@]}; ++i)) 
    do 
     ((${BASH_REMATCH[$i]} &2; exit 1; } 
    done 
else 
     echo "Wrong IP address" >&2 
     exit 1; 
fi 
Смежные вопросы