linux获取网卡广播ip,获得本机所有网卡的IP,MASK,广播地址

该博客文章提供了一段修复后的Python代码,用于在不同操作系统(Darwin/Linux/Windows)下获取本地IP地址、子网掩码和广播地址。代码解决了在Python 3.6.5版本中遇到的错误,并针对中文环境进行了适配。通过调用`ifconfig`或`ipconfig`命令,解析输出以提取所需网络信息。
摘要由CSDN通过智能技术生成

原文链接如下,但是没有办法在中文操作系统下运行,而且可能是因为版本的问题吧,原文中的代码在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))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值