免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2530 | 回复: 1
打印 上一主题 下一主题

已知IP地址和掩码,如何遍历网段内所有IP地址? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-11-20 20:55 |只看该作者 |倒序浏览
求解

论坛徽章:
0
2 [报告]
发表于 2006-11-21 10:22 |只看该作者

  1. #!/bin/sh

  2. ip="192.168.0.8"
  3. mask="255.255.254.0"
  4. range=""

  5. ip_array=(`echo $ip | tr '.' ' '`)
  6. mask_array=(`echo $mask | tr '.' ' '`)

  7. for (( i = 0 ; i < 4 ; i++ ))
  8. do
  9.         if (( ${ip_array[$i]} > 255 || ${mask_array[$i]} > 255 ))
  10.         then
  11.                 exit 1
  12.         else
  13.                 let "tmp = ${ip_array[$i]} & ${mask_array[$i]}"
  14.                 net_array[$i]="$tmp"
  15.         fi
  16. done

  17. for (( i = 31 ; i >= 0 ; i-- ))
  18. do
  19.         let "index = $i / 8"
  20.         part=${mask_array[$index]}
  21.         let "last_bit = $part & 0x01"
  22.         if (( $last_bit == 0x01 ))
  23.         then
  24.                 break
  25.         fi
  26.         let "part >>= 1"
  27.         mask_array[$index]=$part
  28. done

  29. let "mask_zero_num = 31 - $i"
  30. let "range = 2 ** $mask_zero_num"

  31. # fix here to fit range > 256 * 256
  32. let "tail = ${net_array[2]} * 256 + ${net_array[3]}"
  33. ip_part_1=${net_array[0]}
  34. ip_part_2=${net_array[1]}
  35. for (( i = $tail ; i < $range ; i++ ))
  36. do
  37.         let "ip_part_3 = i / 256"
  38.         let "ip_part_4 = i % 256"
  39.         sub_ip="$ip_part_1.$ip_part_2.$ip_part_3.$ip_part_4"
  40.         echo "$sub_ip"
  41. done
复制代码



一个硬限制: 256*256...可以修改适应的...还有工作要做, 就给写成这样吧, 写的不是很好...
另外我不考虑mask中特殊情况, 我都假设0之间没有1这种形式~~~
另外就是bash是必要的...本想用awk...结果发现没有&运算...

[ 本帖最后由 Edengundam 于 2006-11-21 10:23 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP