原文链接如下,但是没有办法在中文操作系统下运行,而且可能是因为版本的问题吧,原文中的代码在3.6.5版本的python中无法运行(报错map对象不可能作为len的输入参数),本文中的代码修正了上述问题。
https://blog.csdn.net/xanxus46/article/details/44682073
import subprocess
import re
import platform
def find_all_ip(platform):
ipstr = '([0-9]{1,3}\.){3}[0-9]{1,3}'
if platform == "Darwin" or platform == "Linux":
ipconfig_process = subprocess.Popen("ifconfig", stdout=subprocess.PIPE)
output = ipconfig_process.stdout.read()
ip_pattern = re.compile('(inet %s)' % ipstr)
if platform == "Linux":
ip_pattern = re.compile('(inet addr:%s)' % ipstr)
pattern = re.compile(ipstr)
iplist = []
for ipaddr in re.finditer(ip_pattern, str(output)):
ip = pattern.search(ipaddr.group())
if ip.group() != "127.0.0.1":
iplist.append(ip.group())
return iplist
elif platform == "Windows":
ipconfig_process = subprocess.Popen("ipconfig", stdout=subprocess.PIPE)
output = ipconfig_process.stdout.read()
output = output.decode('gbk') # !!!!匹配中文的时候,需要先将byte编码为gbk字符串,在进行匹配
ip_pattern = re.compile("IPv4 地址 (\. )*: %s" % ipstr)
pattern = re.compile(ipstr)
iplist = []
for ipaddr in re.finditer(ip_pattern, output):
ip = pattern.search(ipaddr.group())
iplist.append(ip.group())
return iplist
def find_all_mask(platform):
ipstr = '([0-9]{1,3}\.){3}[0-9]{1,3}'
maskstr = '0x([0-9a-f]{8})'
if platform == "Darwin" or platform == "Linux":
ipconfig_process = subprocess.Popen("ifconfig", stdout=subprocess.PIPE)
output = ipconfig_process.stdout.read()
mask_pattern = re.compile('(netmask %s)' % maskstr)
pattern = re.compile(maskstr)
if platform == "Linux":
mask_pattern = re.compile(r'Mask:%s' % ipstr)
pattern = re.compile(ipstr)
masklist = []
for maskaddr in mask_pattern.finditer(str(output)):
mask = pattern.search(maskaddr.group())
if mask.group() != '0xff000000' and mask.group() != '255.0.0.0':
masklist.append(mask.group())
return masklist
elif platform == "Windows":
ipconfig_process = subprocess.Popen("ipconfig", stdout=subprocess.PIPE)
output = ipconfig_process.stdout.read()
output = output.decode('gbk') # !!!!匹配中文的时候,需要先将byte编码为gbk字符串,在进行匹配
mask_pattern = re.compile("子网掩码 (\. )*: %s" % ipstr)
pattern = re.compile(ipstr)
masklist = []
for maskaddr in mask_pattern.finditer(output):
mask = pattern.search(maskaddr.group())
masklist.append(mask.group())
return masklist
def get_broad_addr(ipstr, maskstr):
iptokens = map(int, ipstr.split("."))
masktokens = map(int, maskstr.split("."))
broadlist = []
iptokens = list(iptokens)
masktokens = list(masktokens)
for i in range(len(iptokens)):
ip = iptokens[i]
mask = masktokens[i]
broad = ip & mask | (~mask & 255)#这里原作者是的意思是 先通过ip & mask去掉ip的后n位,n由mask决定,然后再把后n位补充为1.python里面取反也是按位取反,只不过python里面没有专门的无符号整数,所以打印~mask之后是一个负数,但是按位取反是成功的。也就是说01表示有符号数1,按位取反之后表示10表示有符号数-2,也就是网传的~x = -(x + 1)
broadlist.append(broad)
return '.'.join(map(str, broadlist))
def find_all_broad(platform):
ipstr = '([0-9]{1,3}\.){3}[0-9]{1,3}'
if platform == "Darwin" or platform == "Linux":
ipconfig_process = subprocess.Popen("ifconfig", stdout=subprocess.PIPE)
output = (ipconfig_process.stdout.read())
broad_pattern = re.compile('(broadcast %s)' % ipstr)
if platform == "Linux":
broad_pattern = re.compile(r'Bcast:%s' % ipstr)
pattern = re.compile(ipstr)
broadlist = []
for broadaddr in broad_pattern.finditer(str(output)):
broad = pattern.search(broadaddr.group())
broadlist.append(broad.group())
return broadlist
elif platform == "Windows":
iplist = find_all_ip(platform)
masklist = find_all_mask(platform)
broadlist = []
for i in range(len(iplist)):
broadlist.append(get_broad_addr(iplist[i], masklist[i]))
return broadlist
system = platform.system()
print(find_all_ip(system))
print(find_all_mask(system))
print(find_all_broad(system))