Chinaunix

标题: 求:判断某一ip地址是否属于某一ip网段的脚本 [打印本页]

作者: kaka_sun    时间: 2008-12-09 09:56
标题: 求:判断某一ip地址是否属于某一ip网段的脚本
比如 211.130.6.2  是否属于211.130.0.0/16 的ip地址

是 返回 yes

不是 返回no
作者: ynchnluiti    时间: 2008-12-09 09:56
是啊
http://bbs.chinaunix.net/viewthread.php?tid=1324675#pid9723357
作者: waker    时间: 2008-12-09 10:05

  1. ip=211.130.6.2 network=211.130.0.0/16
  2. [ "$(ipcalc -n $ip/${network#*/})" = "$(ipcalc -n $network)" ]&&echo yes||echo no
复制代码


不久前谁问过了?
作者: kaka_sun    时间: 2008-12-09 15:33
上面只是1个ip对应1个ip段,那么如果是1个日志截取中的上百万个ip地址,看看是否属于多个ip段列表,如何写呢?

比如:ip:  211.130.6.2 192.168.24.279  211.147.6.3  202.99.8.1  202.106.7.1 ......

network: 211.103.0.0/20  221.131.0.0/16 192.168.24.0/24....
作者: ly5066113    时间: 2008-12-09 15:36
标题: 回复 #4 kaka_sun 的帖子
知道了单个比较方法,多个就循环贝。
作者: 无声无息    时间: 2008-12-09 15:38
标题: 回复 #4 kaka_sun 的帖子
加个变量,循环一下就ok了
作者: waker    时间: 2008-12-09 15:42
楼主的意思是我们的回答只值 20/1000000 分
作者: kaka_sun    时间: 2008-12-09 15:53


还是谢谢了!
作者: kaka_sun    时间: 2008-12-09 17:00
这个需要读2个文件的双循环,怎么写呢?
作者: ynchnluiti    时间: 2008-12-09 18:30
原帖由 kaka_sun 于 2008-12-9 17:00 发表
这个需要读2个文件的双循环,怎么写呢?

分该给老大的。

供参考:

  1. IPLIST=$(cat ip)
  2. NETLIST=$(cat network)

  3. for ip in ${IPLIST}
  4. do
  5.   echo "IP: $ip";
  6.   for network in ${NETLIST}
  7.   do
  8.     [ "$(ipcalc -n $ip/${network#*/} | sed -n '2,$p')" = "$(ipcalc -n $network | sed -n '2,$p')" ] &&
  9.                               echo -e "$ip\tis in $network" ||
  10.                               echo -e "$ip\tis not in $network"

  11.   done
  12.   echo "--------------------------------";
  13. done
复制代码

作者: kaka_sun    时间: 2008-12-09 21:10
  分的确是点的给老大的,奇怪却分给了另一个好心人!!!!
作者: kaka_sun    时间: 2008-12-10 09:30


供参考:

IPLIST=$(cat ip)
NETLIST=$(cat network)

for ip in ${IPLIST}
do
  echo "IP: $ip";
  for network in ${NETLIST}
  do
    [ "$(ipcalc -n $ip/${n ...


好像不行啊,我测试了一下,不行
作者: ynchnluiti    时间: 2008-12-10 10:12
原帖由 kaka_sun 于 2008-12-10 09:30 发表


好像不行啊,我测试了一下,不行

什么错误?我只简单测了一下。
$ ls
ip  network
$
$ IPLIST=$(cat ip)
$ echo ${IPLIST}
211.130.6.2 192.168.24.279 211.147.6.3 202.99.8.1 202.106.7.1 211.103.0.3 221.131.0.5
$
$ NETLIST=$(cat network)
$ echo ${NETLIST}
211.103.0.0/20 221.131.0.0/16 192.168.24.0/24
$
$ for ip in ${IPLIST}
   do
   echo "IP: $ip";
   for network in ${NETLIST}
   do
     [ "$(ipcalc -n $ip/${network#*/} | sed -n '2,$p')" = "$(ipcalc -n $network | sed -n '2,$p')" ] &&
                               echo -e "$ip\tis in $network" ||
                               echo -e "$ip\tis not in $network"

   done
   echo "--------------------------------";
done
IP: 211.130.6.2
211.130.6.2     is not in 211.103.0.0/20
211.130.6.2     is not in 221.131.0.0/16
211.130.6.2     is not in 192.168.24.0/24
--------------------------------
IP: 192.168.24.279
192.168.24.279  is not in 211.103.0.0/20
192.168.24.279  is not in 221.131.0.0/16
192.168.24.279  is not in 192.168.24.0/24
--------------------------------
IP: 211.147.6.3
211.147.6.3     is not in 211.103.0.0/20
211.147.6.3     is not in 221.131.0.0/16
211.147.6.3     is not in 192.168.24.0/24
--------------------------------
IP: 202.99.8.1
202.99.8.1      is not in 211.103.0.0/20
202.99.8.1      is not in 221.131.0.0/16
202.99.8.1      is not in 192.168.24.0/24
--------------------------------
IP: 202.106.7.1
202.106.7.1     is not in 211.103.0.0/20
202.106.7.1     is not in 221.131.0.0/16
202.106.7.1     is not in 192.168.24.0/24
--------------------------------
IP: 211.103.0.3
211.103.0.3     is in 211.103.0.0/20
211.103.0.3     is not in 221.131.0.0/16
211.103.0.3     is not in 192.168.24.0/24
--------------------------------
IP: 221.131.0.5
221.131.0.5     is not in 211.103.0.0/20
221.131.0.5     is in 221.131.0.0/16
221.131.0.5     is not in 192.168.24.0/24
--------------------------------

作者: kaka_sun    时间: 2008-12-10 10:26
IP: 211.130.6.2
211.130.6.2     is in 211.103.0.0/20
211.130.6.2     is in 221.131.0.0/16
211.130.6.2     is in 192.168.24.0/24
--------------------------------
IP: 192.168.24.279
ipcalc: bad ip address: 192.168.24.279
192.168.24.279  is in 211.103.0.0/20
ipcalc: bad ip address: 192.168.24.279
192.168.24.279  is in 221.131.0.0/16
ipcalc: bad ip address: 192.168.24.279
192.168.24.279  is in 192.168.24.0/24
--------------------------------
IP: 211.147.6.3
211.147.6.3     is in 211.103.0.0/20
211.147.6.3     is in 221.131.0.0/16
211.147.6.3     is in 192.168.24.0/24
--------------------------------
IP: 202.99.8.1
202.99.8.1      is in 211.103.0.0/20
202.99.8.1      is in 221.131.0.0/16
202.99.8.1      is in 192.168.24.0/24
--------------------------------
IP: 202.106.7.1
202.106.7.1     is in 211.103.0.0/20
202.106.7.1     is in 221.131.0.0/16
202.106.7.1     is in 192.168.24.0/24
--------------------------------
IP: 211.103.0.3
211.103.0.3     is in 211.103.0.0/20
211.103.0.3     is in 221.131.0.0/16
211.103.0.3     is in 192.168.24.0/24
--------------------------------
IP: 221.131.0.5
221.131.0.5     is in 211.103.0.0/20
221.131.0.5     is in 221.131.0.0/16
221.131.0.5     is in 192.168.24.0/24
--------------------------------


这是我得出的结果,为何不一样呢?
作者: kaka_sun    时间: 2008-12-10 10:48
IPLIST=$(cat ip)
NETLIST=$(cat network)

for ip in ${IPLIST}
do
  echo "IP: $ip";
  for network in ${NETLIST}
  do
    [ "$(ipcalc -n $ip/${network#*/})" = "$(ipcalc -n $network)" ] &&
                              echo -e "$ip\tis in $network" ||
                              echo -e "$ip\tis not in $network"

  done
  echo "--------------------------------";
done


这样就行了
作者: ynchnluiti    时间: 2008-12-10 12:00
原帖由 kaka_sun 于 2008-12-10 10:48 发表
IPLIST=$(cat ip)
NETLIST=$(cat network)

for ip in ${IPLIST}
do
  echo "IP: $ip";
  for network in ${NETLIST}
  do
    [ "$(ipcalc -n $ip/${network#*/})" = "$(ipcalc -n $network)" ] &&
  ...

看来是ipcalc 的输出不一样。我用sed把第一行去掉了。没试其它方式。
# ipcalc -n 211.105.0.0/24
Address:   211.105.0.0          11010011.01101001.00000000. 00000000
Netmask:   255.255.255.0 = 24   11111111.11111111.11111111. 00000000
Wildcard:  0.0.0.255            00000000.00000000.00000000. 11111111
=>
Network:   211.105.0.0/24       11010011.01101001.00000000. 00000000
HostMin:   211.105.0.1          11010011.01101001.00000000. 00000001
HostMax:   211.105.0.254        11010011.01101001.00000000. 11111110
Broadcast: 211.105.0.255        11010011.01101001.00000000. 11111111
Hosts/Net: 254                   Class C

# ipcalc -n 211.105.0.3/24
Address:   211.105.0.3          11010011.01101001.00000000. 00000011
Netmask:   255.255.255.0 = 24   11111111.11111111.11111111. 00000000
Wildcard:  0.0.0.255            00000000.00000000.00000000. 11111111
=>
Network:   211.105.0.0/24       11010011.01101001.00000000. 00000000
HostMin:   211.105.0.1          11010011.01101001.00000000. 00000001
HostMax:   211.105.0.254        11010011.01101001.00000000. 11111110
Broadcast: 211.105.0.255        11010011.01101001.00000000. 11111111
Hosts/Net: 254                   Class C





欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2