发新话题
打印

如何检测用户输入的一串数字是一个IP地址?

如何检测用户输入的一串数字是一个IP地址?


在一个Shell脚本里面如何检测用户输入的一串数字是一个IP地址?
我实在想不出是怎么处理它输入的东西.


 網中人 回复于:2004-02-26 15:15:10
try:
[code:1:747c382f64]#!/bin/bash

usage () {
        echo "incorrect IP format."
        chkip
}

chkip () {
        read -p "Your IP: " IP
        echo "$IP" | grep -q '[^0-9.]' && usage
        [ $(echo -e "${IP//./\n}" | wc -l) -ne 4 ] && usage
        for i in ${IP//./ } ; do
                [ $((i/8)) -lt 32 ] || usage
        done
}

chkip
echo "$IP is good!"[/code:1:747c382f64]


 bjgirl 回复于:2004-02-27 02:13:55
来个好麻烦点的 ops:
[code:1:3d660a93c7]
#!/bin/ksh
#
n=1
if ! echo $1|grep -q "[a-zA-Z!@#$%^&*()-_+=|\`~<>,/?]"
then
for i in x y z w;do
export ip$i=$(echo $1|cut -f$n -d".")
((n+=1))
done
(($ipx>0&&$ipx<256))&&(($ipy>=0&&$ipy<256))&&\
(($ipz>=0&&$ipz<256))&&(($ipw>=0&&$ipw<256))&&\
echo "$1 is correct IP!"||echo "$1 is incorrect IP!"
else
echo "input error!"
fi

[/code:1:3d660a93c7]


 zhhui2000 回复于:2004-03-02 14:39:31
echo "please input IP:"
read ip
echo $ip |awk -F '.' '{ if ( ($1 >256 || $1 <0) || ($2 >256 || $2 < 0) || ($3 > 256 || $3 < 0) || ($
4 >256 || $4 < 0 )) print $0 ,"is incorrect"}'


 lwq315 回复于:2004-03-02 14:39:59
谢谢~~!我琢磨琢磨看~!


 網中人 回复于:2004-03-02 14:44:37
有人測過 1.2.3 或 1.2.3.4.5 的 format 嗎?  ^_^

還有:
.1.2.3.4
1.2.3.4.
.1.2.3
1.2.3.


 網中人 回复于:2004-03-02 16:21:37
為了能夠測試更多錯誤格式,及更方便使用,我將原本的 code 修改了一下:
[code:1:dfb0e0da46]#!/bin/bash

usage () {
        echo "incorrect IP format."
        readip
        chkip
}

readip () {
        read -p "Your IP: " IP
}

chkip () {
        echo "$IP" | grep -Eq '[^0-9.]|^\.|\.$' && usage
        [ $(echo -e "${IP//./\n}" | wc -l) -ne 4 ] && usage
        for i in ${IP//./ } ; do
                [ $((i/8)) -lt 32 ] || usage
        done
}

if [ "$1" ]; then
        IP=$1
else
        readip
fi
chkip
echo "$IP is good!"[/code:1:dfb0e0da46]


 taocb006 回复于:2004-03-02 16:27:03
echo "please input IP:"
read ip
echo $ip |awk -F"." '{
if ( ($1>256 || $1<0) || ($2>256 || $2 < 0) || ($3 > 256 || $3 < 0) || ($ 4 >256
 || $4 < 0 ) || ($NF>4) ) print $0 ,"is incorrect"}'


 網中人 回复于:2004-03-02 16:36:22
[quote:71be9b60f0="taocb006"]echo "please input IP:"
read ip
echo $ip |awk -F"." '{
if ( ($1>256 || $1<0) || ($2>256 || $2 < 0) || ($3 > 256 || $3 < 0) || ($ 4 >256
 || $4 < 0 ) || ($NF>4) ) print $..........[/quote:71be9b60f0]

請問這跟 zhhui2000 貼的差在哪?


 taocb006 回复于:2004-03-02 16:42:13
增加了$NF等判断,兄弟!!!

对于.1.2.3.4.或1.2.3.4.5等,原来的是有问题的! 


 網中人 回复于:2004-03-02 17:04:23
哦... 了解...

不過,對 1.2.3.4. 還是不能過濾...


 forest077 回复于:2004-03-02 18:02:11
网版主,taocb006的代码我试过了,你说的那种情况可以过滤,其他的非法情况也都能过滤,很好。不过里面NF不要加$。


 bjgirl 回复于:2004-03-02 18:05:11
谁测试测试我的那段?,ops:


 r2007 回复于:2004-03-02 18:25:05
[quote:c8e56fd9f4="forest077"]网版主,taocb006的代码我试过了,你说的那种情况可以过滤,其他的非法情况也都能过滤,很好。不过里面NF不要加$。[/quote:c8e56fd9f4]
这些非法情况如何?^_^
[code:1:c8e56fd9f4]1.1--------2.+3.0256
0333.0257.0355.0307
0x99.1  2.+3.0256
1.1 1.2 3.3
0xab.1.1.1
[/code:1:c8e56fd9f4]


 bjgirl 回复于:2004-03-02 18:36:33
[quote:586ff87592="r2007"][/quote:586ff87592]
[code:1:586ff87592]
#!/bin/ksh
#
if ! echo $1|grep -q "[a-zA-Z!@#$%^&*()-_+=|\`~<>,/?]";then

n=1
for i in x y z w;do
        export ip$i=$(echo $1|cut -f$n -d".")
        ((n+=1))
        done
(($ipx>0&&$ipx<256))&&(($ipy>=0&&$ipy<256))&&\
(($ipz>=0&&$ipz<256))&&(($ipw>=0&&$ipw<256))&&\
echo "$1 is correct IP!"||echo "$1 is incorrect IP!"
else
        echo "input error!"
fi 2>/dev/null[/code:1:586ff87592]
我的脚本测试:
[quote:586ff87592]
$ksh ipp 1.1--------2.+3.0256
input error!
$ksh ipp 0333.0257.0355.0307
0333.0257.0355.0307 is incorrect IP!
$ksh ipp 0x99.1  2.+3.0256
input error!
$ksh ipp 1.1 1.2 3.3
1.1 is incorrect IP!
$ksh ipp 0xab.1.1.
input error!
[/quote:586ff87592][code:1:586ff87592]
ksh ipp 202.106.127.117
202.106.127.117 is correct IP!
[/code:1:586ff87592]


 forest077 回复于:2004-03-02 19:33:52
r2007版主说的确实都没有测到,其中包含空格、以0x开头的都不能过滤,汗……
bjgirl和网版主的代码太高,我还没有学到,在我的sco上直接运行也有问题,所以看不懂。我把taocb006的稍微改了改,是可以过滤掉上面提到的几种情况的。
[code:1:cf01ca6d75]
#!/bin/sh
echo "please input IP:"
read ip
echo $ip |awk -F"." '
{
if ( ($1<=256 && $1>=0) &&
($2<=256 && $2>=0) &&
($3<=256 && $3>=0) &&
($4<=256 && $4>=0) &&
(NF==4) &&
($1~/^[0-9]+$/)) &&
($2~/^[0-9]+$/)) &&
($3~/^[0-9]+$/)) &&
($4~/^[0-9]+$/))
{
print $0,"correct"
}
else
{
print $0,"error"
}
}'
[/code:1:cf01ca6d75]


 r2007 回复于:2004-03-02 23:20:49
to: bjmm
ksh我没有接触过,不过我猜这个未必能测出来^_^
1.1.1.-0
or
1.1.1.-
or
1.0.1.1-
or
1.0.0.1-------
至少可以躲过echo "input error!"这一关


 bjgirl 回复于:2004-03-02 23:31:44
[quote:42d1db2658="r2007"]to: bjmm
ksh我没有接触过,不过我猜这个未必能测出来^_^
1.1.1.-0
or
1.1.1.-
or
1.0.1.1-
or
1.0.0.1-------
至少可以躲过echo "input error!"这一关[/quote:42d1db2658]
我我我.....哇~~,不带这么刁难我的! :em16: :em12: :em08:


 bjgirl 回复于:2004-03-02 23:40:13
其实把那个grep里的改改就可以用了.


 網中人 回复于:2004-03-03 00:23:07
有那麼難嗎?
echo "$IP" | grep -Eq '[^0-9.]|^\.|\.$|^0*\.' && printerr

okay,再改一次,這應該可用了吧:
[code:1:1e4e8fb095]#!/bin/bash

printerr () {
        echo "incorrect IP format."
        readip
        chkip
}

readip () {
        read -p "Your IP: " IP
}

chkip () {
        echo "$IP" | grep -Eq '[^0-9.]|^\.|\.$|^0*\.' && printerr
        [ $(echo -e "${IP//./\n}" | wc -l) -ne 4 ] && printerr
        for i in ${IP//./ } ; do
                [ $((10#$i/8)) -lt 32 ] || printerr
        done
}

if [ "$1" ]; then
        IP=$1
else
        readip
fi
chkip
echo "$IP is good!"
[/code:1:1e4e8fb095]


 bjgirl 回复于:2004-03-03 01:24:55
欢迎大家考验!
[code:1:faf8326f26]
cat ipp
#!/bin/ksh
#
#
var=$(echo $1|tr -d .)
if echo $var|sed -n '/^[0-9.*]/p' >/dev/null 2>&1;then
n=1
        for i in x y z w;do
                export ip$i=$(echo $1|cut -f$n -d".")
                ((n+=1))
        done
        (($ipx>0&&$ipx<256))&&(($ipy>=0&&$ipy<256))&&\
        (($ipz>=0&&$ipz<256))&&(($ipw>0&&$ipw<256))&&\
        echo "$1 is: correct IP!"||echo "$1 is: incorrect IP!"
fi 2>/dev/null[/code:1:faf8326f26]
测试文件:[quote:faf8326f26]
cat iplist
1.1.1.-0
1.1.1.-
1.0.1.1-
1.0.0.1-------
1.1--------2.+3.0256
0333.0257.0355.0307
0x99.1  2.+3.0256
1.1 1.2 3.3
0xab.1.1.1
1.2.3.4
192.168.2.2
211.12.2.2
61.51.142.3[/quote:faf8326f26]
测试代码:[code:1:faf8326f26]
for i in $(<iplist);do 
ksh ipp $i
done[/code:1:faf8326f26]
测试结果:[quote:faf8326f26]
1.1.1.-0 is: incorrect IP!
1.1.1.- is: incorrect IP!
1.0.1.1- is: incorrect IP!
1.0.0.1------- is: incorrect IP!
1.1--------2.+3.0256 is: incorrect IP!
0333.0257.0355.0307 is: incorrect IP!
0x99.1 is: incorrect IP!
2.+3.0256 is: incorrect IP!
1.1 is: incorrect IP!
1.2 is: incorrect IP!
3.3 is: incorrect IP!
0xab.1.1.1 is: incorrect IP!
1.2.3.4 is: correct IP!
192.168.2.2 is: correct IP!
211.12.2.2 is: correct IP!
61.51.142.3 is: correct IP!
[/quote:faf8326f26]


 bjgirl 回复于:2004-03-03 01:30:11
卡在这个IP很长时间!累死本MM了
1.1.1.-0 
测试的时候总说他是IP,,不过在我的努力下他终于说实话了.... ops: 
建议此主题加精华!


 網中人 回复于:2004-03-03 01:31:56
MM 請加兩個 IP 來測測看...

1.2.3.
.1.2.3


 bjgirl 回复于:2004-03-03 01:34:38
$ksh ipp .1.2
.1.2 is: incorrect IP!
$ksh ipp 1.2.3
1.2.3 is: incorrect IP!
$ksh ipp .1.2.3
.1.2.3 is: incorrect IP!
$ksh ipp 1.2.3.
1.2.3. is: incorrect IP!


 網中人 回复于:2004-03-03 01:39:55
還有... MM 為何認為第 4 碼的 IP 不可以是 0 呢?
因為一個 mask_bit 少於 24 的 IP 都可以用 0 哦...

若,本串討論再加入 netmask 判斷,那就更為精彩了...  ^_^


 bjgirl 回复于:2004-03-03 01:46:52
[quote:21f77312aa="網中人"]還有... MM 為何認為第 4 碼的 IP 不可以是 0 呢?
因為一個 mask_bit 少於 24 的 IP 都可以用 0 哦...

若,本串討論再加入 netmask 判斷,那就更為精彩了...  ^_^[/quote:21f77312aa]
唉!,,,,还是有问题!,不弄了!sleep去! :oops:


 r2007 回复于:2004-03-03 09:43:59
网兄所供代码检测不到这些
1...1
1.02.3.4
1.2.003.4
1.0000000000000000000002.21.1

将code改一下,可以检测到第一种情况了,第二种之后的这些情况首先不知道是不是符合ip的规范,再是如何识别它?
[code:1:8d2629555d]echo "$IP" | grep -Eq '[^0-9.]|^\.|\.$|^0*\.|\.\.' && printerr [/code:1:8d2629555d]


 網中人 回复于:2004-03-03 13:03:18
感謝 r2007 兄幫忙測試及提供修正﹗
關於後面帶 0 開頭的 ip ,應該是不規範的,因為會被當作八進位來處理。因此要過濾掉:
[code:1:fc71cb7f6f]echo $i | grep -Eq "^0+[^0]" && printerr[/code:1:fc71cb7f6f]

我再次修改代碼如下,歡迎測試:
[code:1:fc71cb7f6f]#!/bin/bash

printerr () {
        echo "incorrect IP format."
        readip
        chkip
}

readip () {
        read -p "Your IP: " IP
}

chkip () {
        echo "$IP" | grep -Eq '[^0-9.]|^\.|\.$|^0*\.|\.\.' && printerr
        [ $(echo -e "${IP//./\n}" | wc -l) -ne 4 ] && printerr
        for i in ${IP//./ } ; do
                echo $i | grep -Eq "^0+[^0]" && printerr
                [ $((10#$i/8)) -gt 31 ] && printerr
        done
}

if [ "$1" ]; then
        IP=$1
else
        readip
fi
chkip
echo "$IP is good!"
[/code:1:fc71cb7f6f]


 labrun 回复于:2004-03-03 14:55:17
呵呵,你们够专业!佩服佩服


 bjgirl 回复于:2004-03-03 16:27:36
[quote:2811f71a7e="labrun"]呵呵,你们够专业!佩服佩服[/quote:2811f71a7e]
受益匪浅:oops:


 bjgirl 回复于:2004-03-04 01:04:59
[quote:fbf2e6edad="網中人"]還有... MM 為何認為第 4 碼的 IP 不可以是 0 呢?
因為一個 mask_bit 少於 24 的 IP 都可以用 0 哦...

若,本串討論再加入 netmask 判斷,那就更為精彩了...  ^_^[/quote:fbf2e6edad]
懒啦~~,嘻嘻,还是看看netman的这个脚本吧! :oops:
http://www.chinaunix.net/jh/24/196402.html


 maluyao 回复于:2005-05-19 14:57:14
Linux 通过
ipcalc  -m 192.168.0.259  &>/dev/null  && echo 'This is an IP Address' ||echo 'This is not an IP Addr'


 rhinux 回复于:2005-06-04 00:20:30
IPv6呢?


 supersuper 回复于:2005-06-16 11:32:32
受益匪浅啊

LUPA社区系统帐号.转贴文章之用.
发新话题