. : : ClassiClub ForuM : : .

会员中心 论坛帮助 日历事件 标记论坛已读
返回   精品技术论坛 » 技术论坛 » 『软件使用』 » 专题:命令正则

『软件使用』: 电脑软件推荐, 电脑软件使用, 经验分享



发表新主题 关闭主题
 
主题工具
funnyPC
 
funnyPC 的头像
『手机数码』版主
 
资 料:
注册日期: Oct 2003
帖子: 8,127 声望值: 4
精华: 13,解答: 23
#1 旧 2012-12-03, 12:29:33 默认 已解答: 【求助】求个生成 google ip地址列表的批处理
funnyPC 当前离线  

目标:

使用 nslookup -q=TXT _netblocks.google.com 8.8.8.8 获得 google的ip地址范围,然后将其转换输出生成一份完整的所有ip的列表。
最佳解答为:namejm
根据12楼的子网掩码算法写出了批处理
没有对0和255做特殊处理(由于没有相关知识,不知道哪些能剔除哪些可保留,索性都保留了下来)
在IP列表文件中
每个IP段的格式为:
第一行列出 起始IP/掩码长度
第二行列出 起始IP段~终止IP段
从第三行开始才是正式的IP列表
前两行以分号打头
每个IP段之间用空行分隔
形如:
引用:
;216.239.32.0/19
;216.239.32.0~216.239.63.0
216.239.32.0
216.239.32.1
216.239.32.2
……
以下是批处理代码:
代码:
@echo off
setlocal enabledelayedexpansion

rem 生成32位长的纯1和纯0字符串
for /l %%i in (1,1,32) do (
	set zeroStr=!zeroStr!0
	set oneStr=!oneStr!1
)

nslookup -q=TXT _netblocks.google.com 8.8.8.8>result.txt 2>nul
for /f "delims=" %%i in (result.txt) do set "str=%%i"

rem 剔除字符串中的无关信息
set "str=%str:"=%"
set "str=%str:*ip4:=%"
set "str=%str:ip4:=%"
set "str=%str:?all=%"

echo.&echo     正在生成IP列表,将持续1至数分钟,请耐心等待...

(for %%x in (%str%) do (
	echo;&echo ;%%x
	for /f "delims=./ tokens=1-5" %%i in ("%%x") do (
		rem 获取每节上的IP
		set IP1=%%i
		set IP2=%%j
		set IP3=%%k
		set IP4=%%l
		
		rem 获取掩码长度及所在的IP子节点位置(第1~4节)
		set subMaskLen=%%m
		set /a section=%%m / 8
		set /a mod=%%m %% 8
		if !mod! neq 0 set /a section+=1
		
		rem 生成二进制表示的掩码字符串,并且用点号分成4节
		call set subMaskStr=%%oneStr:~0,!subMaskLen!%%%%zeroStr:~!subMaskLen!%%
		set subMaskStr=!subMaskStr:~0,8!.!subMaskStr:~8,8!.!subMaskStr:~16,8!.!subMaskStr:~24!	
		
		rem 获取掩码中最后一个非纯0的节(第1~4节),并用二进制表示
		set tmpSubMaskStr=!subMaskStr:.= !
		set num=0
		for %%a in (!tmpSubMaskStr!) do (
			set /a num+=1
			if !num! equ !section! set mask_section=%%a
		)
		
		rem 把用二进制表示的掩码中的最后一个非纯0的节转为十进制
		set sum=0
		for /l %%a in (8,-1,1) do (
			set multip=1
			for /l %%b in (1,1,%%a) do (
				set /a multip*=2
			)
			set /a multip/=2
			set /a multip*=!mask_section:~-%%a,1!
			set /a sum+=!multip!
		)
		call set tmpMaskIP=%%IP!section!%%
		
		rem 获取主机位上第1节最大的IP值
		set /a "endIP=!sum!^^255^|!tmpMaskIP!"
		
		rem 获取网络IP字段
		set /a layer=!section!-1
		set "preIP="
		for /l %%a in (1,1,!layer!) do (
			set preIP=!preIP!.!IP%%a!
		)
		set /a layer+=1
		call set beginIP=%%IP!section!%%
		
		rem 获取IP的范围字段
		for /f "delims=/" %%a in ("%%x") do set IPstr=%%a
		call echo ;!IPstr!~%%IPstr:.!beginIP!.0=.!endIP!.0%%
		
		rem 在子网第1节的起始值和终止值之间生成IP列表
		for /l %%a in (!beginIP!,1,!endIP!) do (
			setlocal
			set preIP=!preIP!.%%a
			call :ListIP
			endlocal
		)
	)
))>result.txt
start result.txt
exit

:ListIP
set /a layer+=1
for /l %%i in (0,1,255) do (
	setlocal
	if !layer! lss 4 (
		set preIP=!preIP!.%%i
		call :ListIP
	) else (
		echo !preIP:~1!.%%i
	)
	endlocal
)
goto :eof
坏月
 
坏月 的头像
支柱会员
 
资 料:
注册日期: Sep 2002
帖子: 5,961 声望值: 7
精华: 0,解答: 13
#2 旧 2012-12-03, 13:09:50 默认
坏月 当前离线  

服务器: google-public-dns-a.google.com
Address: 8.8.8.8

DNS request timed out.
timeout was 2 seconds.
非权威应答:
_netblocks.google.com text =

"v=spf1 ip4:216.239.32.0/19 ip4:64.233.160.0/19 ip4:66.249.80.0/20 ip4:7
2.14.192.0/18 ip4:209.85.128.0/17 ip4:66.102.0.0/20 ip4:74.125.0.0/16 ip4:64.18.
0.0/20 ip4:207.126.144.0/20 ip4:173.194.0.0/16 ?all"


静坐常思己过,闲谈莫论人非。
门之外是友情,门之内是爱情,今生今世,与你爱到门口为止
常说的是乐生于苦,可乐极生悲道理又自古!
namejm
 
namejm 的头像
超级会员
 
资 料:
注册日期: Apr 2009
帖子: 1,393 声望值: 3
精华: 21,解答: 84
#3 旧 2012-12-03, 13:33:05 默认
namejm 当前离线  

是这样的吗?
代码:
@echo off
nslookup -q=TXT _netblocks.google.com 8.8.8.8>result.txt 2>nul
for /f "delims=" %%i in (result.txt) do set "str=%%i"

set "str=%str:"=%"
set "str=%str:*ip4:=%"
set "str=%str:ip4:=%"
set "str=%str:?all=%"

(for %%i in (%str%) do (
	for /f "delims=./ tokens=1-5" %%j in ("%%i") do (
		for /l %%a in (%%m,1,%%n) do (
			echo %%j.%%k.%%l.%%a
		)
	)
))>result.txt
start result.txt


TotalCommder、EveryThing、batch、AutoHotKey、EverEdit
精通Word、Excel、PPT的安装与卸载
熟练掌握VB、C++、SQL的拼读与缩写
funnyPC
 
funnyPC 的头像
『手机数码』版主
 
资 料:
注册日期: Oct 2003
帖子: 8,127 声望值: 4
精华: 13,解答: 23
#4 旧 2012-12-03, 14:39:55 默认
funnyPC 当前离线  

引用:
作者: namejm 查看帖子
是这样的吗?[code]@echo offnslookup -q=TXT _netblocks.google.com 8.8.8.8>result.txt 2>nulfor /f "delims=" %%i in (result.txt) do set "str=%%i"set "str=%str:"=%"set "s...
子网掩码部分没有解析,其它都可以了。

比如 216.239.32.0/19 这个,得是从 216.239.32.1 一直到 216.239.63.254
namejm
 
namejm 的头像
超级会员
 
资 料:
注册日期: Apr 2009
帖子: 1,393 声望值: 3
精华: 21,解答: 84
#5 旧 2012-12-03, 15:20:31 默认
namejm 当前离线  

对子网掩码的概念不熟悉
还得找资料现学
求科普
bullfrog
 
bullfrog 的头像
热心会员
 
资 料:
注册日期: Mar 2002
帖子: 9,551 声望值: 5
精华: 0,解答: 3
#6 旧 2012-12-03, 16:57:01 默认
bullfrog 当前离线  

我这个帖子里有 http://bbs.et8.net/bbs/showthread.php?t=1035933
从一个地方找的, 网址找不到了..
funnyPC
 
funnyPC 的头像
『手机数码』版主
 
资 料:
注册日期: Oct 2003
帖子: 8,127 声望值: 4
精华: 13,解答: 23
#7 旧 2012-12-03, 17:10:09 默认
funnyPC 当前离线  

引用:
作者: bullfrog 查看帖子
我这个帖子里有 http://bbs.et8.net/bbs/showthread.php?t=1035933
从一个地方找的, 网址找不到了..
没有啊,你没仔细看我的贴吧?我不是要获知ip段,是要生成ip列表
bullfrog
 
bullfrog 的头像
热心会员
 
资 料:
注册日期: Mar 2002
帖子: 9,551 声望值: 5
精华: 0,解答: 3
#8 旧 2012-12-03, 21:06:30 默认
bullfrog 当前离线  

引用:
作者: funnyPC 查看帖子
没有啊,你没仔细看我的贴吧?我不是要获知ip段,是要生成ip列表
啊 好吧 ..

此帖于 2012-12-03 21:38:25 被 bullfrog 编辑. .
liudidi
 
liudidi 的头像
核心会员
 
资 料:
注册日期: Mar 2002
帖子: 3,326 声望值: 3
精华: 0,解答: 18
#9 旧 2012-12-04, 11:12:52 默认
liudidi 当前离线  

引用:
作者: namejm 查看帖子
对子网掩码的概念不熟悉
还得找资料现学
求科普
参考这个:http://blog.sina.com.cn/s/blog_4d6a2e430100ir92.html

不过用批处理恐怕很难写这个。
namejm
 
namejm 的头像
超级会员
 
资 料:
注册日期: Apr 2009
帖子: 1,393 声望值: 3
精华: 21,解答: 84
#10 旧 2012-12-04, 11:59:58 默认
namejm 当前离线  

昨晚查阅了一些资料
还是云里雾里
但是感觉批处理完全没问题
因为 set /a 是支持与或非亦或之类的位运算的
还需要一些时间来了解掩码的知识才能写代码
namejm
 
namejm 的头像
超级会员
 
资 料:
注册日期: Apr 2009
帖子: 1,393 声望值: 3
精华: 21,解答: 84
#11 旧 2012-12-04, 12:57:52 默认
namejm 当前离线  

楼主说 216.239.32.0/19 的IP段范围是 216.239.32.1~216.239.63.254
看了 liudidi 9楼给出的链接
引用:
27.8.0.0/13
27.36.0.0/14
27.40.0.0/13
分别对应的IP段范围是
引用:
"58.30.0.0","58.63.255.255"
"58.66.0.0","58.67.255.255"
"58.82.0.0","58.82.127.255"
"58.83.0.0","58.83.255.255"
到底哪种算法是正确的?
后面的3个IP范围居然有4个结果,难道是举例前后不一致?
funnyPC
 
funnyPC 的头像
『手机数码』版主
 
资 料:
注册日期: Oct 2003
帖子: 8,127 声望值: 4
精华: 13,解答: 23
#12 旧 2012-12-04, 15:28:37 默认
funnyPC 当前离线  

引用:
作者: namejm 查看帖子
昨晚查阅了一些资料
还是云里雾里
但是感觉批处理完全没问题
因为 set /a 是支持与或非亦或之类的位运算的
还需要一些时间来了解掩码的知识才能写代码
肯定能做到。

按你说的我试了一下
set a=255
set /a "%a%&0x10"
这样会输出16

做掩码运算肯定没问题,主要是不支持二进制,因此需要写一个call来做转换,将掩码转换为十进制或十六进制供运算。

由于掩码是自左向右的连续2进制1的位数,不存在1/0交替的情况,这样的话就可以取巧,不必写出完整的进制转换函数,简单做个硬编码即可。

/1=128.0.0.0
/2=192.0.0.0
/3=224.0.0.0
/4=240.0.0.0
/5=248.0.0.0
/6=252.0.0.0
/7=254.0.0.0
/8=255.0.0.0
/9=255.128.0.0
/10=255.192.0.0
/11=255.224.0.0
/12=255.240.0.0
/13=255.248.0.0
/14=255.252.0.0
/15=255.254.0.0
/16=255.255.0.0
/17=255.255.128.0
/18=255.255.192.0
/19=255.255.224.0
/20=255.255.240.0
/21=255.255.248.0
/22=255.255.252.0
/23=255.255.254.0
/24=255.255.255.0
/25=255.255.255.128
/26=255.255.255.192
/27=255.255.255.224
/28=255.255.255.240
/29=255.255.255.248
/30=255.255.255.252
/31=255.255.255.254
/32=255.255.255.255

现在的需要做的是将dns txt查询切分后的地址和掩码用/分割开,将掩码位数作为参数call转换得到点分格式掩码,再将地址和掩码用.分割开,每个部分一一对应,计算逻辑如下:
先将掩码部分与255相异:如掩码224则set /a "224^255"得31
再将结果与地址部分相或:如掩码224得31后set /a "31|32"得63,则地址从32一直到63

最后是各部分列举后循环,可能需要再过滤末位的0和255处理一下。

目前想到就这些,没复习掩码计算知识,不知算法对不对。
funnyPC
 
funnyPC 的头像
『手机数码』版主
 
资 料:
注册日期: Oct 2003
帖子: 8,127 声望值: 4
精华: 13,解答: 23
#13 旧 2012-12-04, 15:39:36 默认
funnyPC 当前离线  

引用:
作者: namejm 查看帖子
楼主说 216.239.32.0/19 的IP段范围是 216.239.32.1~216.239.63.254
看了 liudidi 9楼给出的链接

分别对应的IP段范围是

到底哪种算法是正确的?
后面的3个IP范围居然有4个结果,难道是举例前后不一致?
算法描述是正确的,应该是举例不一致吧
minuteman
 
minuteman 的头像
终极会员
 
资 料:
注册日期: Oct 2001
帖子: 18,762 声望值: 3
精华: 1,解答: 26
#14 旧 2012-12-04, 16:54:40 默认
minuteman 当前离线  

根据2楼的结果
216.239.32.0/19
64.233.160.0/19
66.249.80.0/20
72.14.192.0/18
209.85.128.0/17
66.102.0.0/20
74.125.0.0/16
64.18.0.0/20
207.126.144.0/20
173.194.0.0/16



216.239.32.0--216.239.63.255
64.233.160.0--64.233.191.255
66.249.80.0--66.249.95.255
72.14.192.0--72.14.255.255
209.85.128.0--209.85.255.255
66.102.0.0--66.102.15.255
74.125.0.0--74.125.255.255
64.18.0.0--64.18.15.255
207.126.144.0--207.126.159.255
173.194.0.0--173.194.255.255
liudidi
 
liudidi 的头像
核心会员
 
资 料:
注册日期: Mar 2002
帖子: 3,326 声望值: 3
精华: 0,解答: 18
#15 旧 2012-12-04, 22:07:51 默认
liudidi 当前离线  

引用:
作者: namejm 查看帖子
楼主说 216.239.32.0/19 的IP段范围是 216.239.32.1~216.239.63.254
看了 liudidi 9楼给出的链接

分别对应的IP段范围是

到底哪种算法是正确的?
后面的3个IP范围居然有4个结果,难道是举例前后不一致?
0和255在ip实际使用的时候是不能用的,所以1-254也是对的。
不过那个链接里举的例子是不对的。
发表新主题 关闭主题

主题工具

论坛规则  发帖规则
不可以发表主题
不可以回复帖子
不可以上传附件
不可以编辑自己的帖子
论坛启用 vB 代码
版面启用 表情符号
版面启用 [IMG] 代码
版面禁用 HTML 代码


所有时间均为北京时间, 现在的时间是 09:43:54.

本论坛带宽由迅通网络提供
SSL证书由TrustAsia提供

Copyright © 2000 - 2019 ClassiClub Forum All Rights Reserved.
粤ICP备09123456号