簡體   English   中英

Shell腳本+簡短語法以驗證有效IP

[英]shell script + short syntax to verify valid IP

我的問題是,我想獲得一些簡短而明智的想法來驗證IP地址,然后我的示例

也許我可以在我的ksh腳本中結合使用一些perl語法

利迪亞

不要重新發明輪子。

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地址類型。

或者,如果地址與您想要的任何符號相匹配,則只需使用上述類似內容並調用相同的子對象即可,也可以使用類似的東西。

在您的shell腳本中使用它的方式如下:

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

上面的代碼將替換您完整的“ case”塊。

同樣,如果您需要在perl腳本調用中內聯正則表達式,則可以通過閱讀模塊的代碼來實現。

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"

分割地址而不接觸IFS,並通過按位移位避免復雜的檢查:

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

這是一些更短,更簡單的方法。 它僅檢查基本結構,但在某些情況下已足夠。

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;

將IP地址保存到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

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"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM