故事的开头是:为了安全,服务器访问应该配置一个可以访问的白名单。
过了几天,运维组提要求:得把开发的网段给剔出去,但是还要留几个ip给开发负责验证的用。
偏偏管理平台功能有限,只能设置成白名单。我这一想,如果把服务器当成头顶,可以访问的ip当做头发,那么这可是个新鲜的西洋景:
搞笑归搞笑,正事还是要干的,手工编ip太麻烦了,于是写了一段bug。基本思路是这样的:
假如中间那根头发丝和地中那个海是172.1.2.3/8,换算成二进制,分别是10101100000000010000001000000011和10101100000000000000000000000000,那么先要把海挖出来,然后直接把头发丝放进去就行了。挖海算白名单的时候,转换成二进制从高位开始,前边一样,当前位置取反,取出来的一定是头发。
def ip2bin(ip):
s =bin(sum(map(lambda x,y:x<<y,map(int,ip.split('.')),(24,16,8,0))))
s = s.split('b')[1]
s = '0'*(32-len(s)) + s
return s
def bin2ip(b):
a=[]
for i in range(4):
a.append(str(int(b[i*8:i*8+8],2)))
return '.'.join(a)
def get_setting(ip,mask):
s_ip = ip2bin(ip)
#s_ip
#bin2ip(s_ip)
s=""
for p in range(mask):
n= s+str(1-int(s_ip[p]) )
s+=str( int(s_ip[p]) )
#print( n )
print( '%s\t%s'%( '%s/%d'%( bin2ip(n + '0'*(32-p-1) ) ,p+1 ) , '%s - %s'%( bin2ip(n + '0'*(32-p-1) ) , bin2ip(n + '1'*(32-p-1)) ) ) )
get_setting('172.1.2.3',8)