Python获取本机所有网卡ip,掩码和广播地址实例代码


Posted in Python onJanuary 22, 2018

本文主要研究的是使用Python获取本机所有网卡ip,掩码和广播地址,分享了相关的实例代码,具体介绍如下。

搜了一天,竟然没找到一段合适的代码来获取机器中所有网卡的ip,掩码和广播地址,大部分都是用socket,但是socket通常返回的要不就是内网地址,要不就是公网地址,不能够找到所有地址,真的太忧桑了,决定自己通过ifconfig或ipconfig的返回信息,一步步地过滤了。这次的代码主要用到了正则表达式和subprocess模块,而且为了兼容所有平台(win,linux和mac),也用到了platform来判断系统类型,不说太多,代码如下:

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()
  ip_pattern = re.compile("IPv4 Address(\. )*: %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


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()
  mask_pattern = re.compile(r"Subnet Mask (\. )*: %s" % ipstr)
  pattern = re.compile(ipstr)
  masklist = []
  for maskaddr in mask_pattern.finditer(str(output)):
   mask = pattern.search(maskaddr.group())
   if mask.group() != '255.0.0.0':
    masklist.append(mask.group())
  return masklist


def get_broad_addr(ipstr, maskstr):
 iptokens = map(int, ipstr.split("."))
 masktokens = map(int, maskstr.split("."))
 broadlist = []
 for i in range(len(iptokens)):
  ip = iptokens[i]
  mask = masktokens[i]
  broad = ip & mask | (~mask & 255)
  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))

总结

以上就是本文关于Python获取本机所有网卡ip,掩码和广播地址实例代码的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

Python 相关文章推荐
python正常时间和unix时间戳相互转换的方法
Apr 23 Python
讲解Python的Scrapy爬虫框架使用代理进行采集的方法
Feb 18 Python
使用Pyinstaller的最新踩坑实战记录
Nov 08 Python
轻松实现TensorFlow微信跳一跳的AI
Jan 05 Python
python 实现判断ip连通性的方法总结
Apr 22 Python
Django中间件实现拦截器的方法
Jun 01 Python
使用Python读取二进制文件的实例讲解
Jul 09 Python
Python实现基于PIL和tesseract的验证码识别功能示例
Jul 11 Python
python3 使用Opencv打开USB摄像头,配置1080P分辨率的操作
Dec 11 Python
如何用Matplotlib 画三维图的示例代码
Jul 28 Python
python UIAutomator2使用超详细教程
Feb 19 Python
python自动化操作之动态验证码、滑动验证码的降噪和识别
Aug 30 Python
Linux CentOS7下安装python3 的方法
Jan 21 #Python
简述Python2与Python3的不同点
Jan 21 #Python
手把手教你用python抢票回家过年(代码简单)
Jan 21 #Python
分析Python中解析构建数据知识
Jan 20 #Python
学习Python selenium自动化网页抓取器
Jan 20 #Python
python使用pil库实现图片合成实例代码
Jan 20 #Python
python方向键控制上下左右代码
Jan 20 #Python
You might like
第十四节--命名空间
2006/11/16 PHP
开发大型 PHP 项目的方法
2007/01/02 PHP
PHP从FLV文件获取视频预览图的方法
2015/03/12 PHP
php基于session实现数据库交互的类实例
2015/08/03 PHP
Swoole源码中如何查询Websocket的连接问题详解
2020/08/30 PHP
正则表达式判断是否存在中文和全角字符和判断包含中文字符串长度
2008/09/27 Javascript
jQuery autocomplete插件修改
2009/04/17 Javascript
JQuery从头学起第二讲
2010/07/04 Javascript
jQuery之字体大小的设置方法
2014/02/27 Javascript
SeaJS入门教程系列之使用SeaJS(二)
2014/03/03 Javascript
js delete 用法(删除对象属性及变量)
2014/08/24 Javascript
浅析Javascript中“==”与“===”的区别
2014/12/23 Javascript
JavaScript事件委托用法分析
2015/01/24 Javascript
jQuery元素属性操作实例(设置、获取及删除元素属性)
2016/09/08 Javascript
微信小程序 Video API实例详解
2016/10/02 Javascript
关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)
2016/12/14 Javascript
node.js利用redis数据库缓存数据的方法
2017/03/01 Javascript
angular select 默认值设置方法
2017/06/23 Javascript
从vue源码看props的用法
2019/01/09 Javascript
JS高阶函数原理与用法实例分析
2019/01/15 Javascript
优雅的处理vue项目异常实战记录
2019/06/05 Javascript
[51:22]Fnatic vs IG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
[54:57]DOTA2-DPC中国联赛定级赛 Aster vs DLG BO3第二场 1月8日
2021/03/11 DOTA
Python运算符重载详解及实例代码
2017/03/07 Python
从头学Python之编写可执行的.py文件
2017/11/28 Python
python3+PyQt5自定义视图详解
2018/04/24 Python
python3.6数独问题的解决
2019/01/21 Python
如何理解python面向对象编程
2020/06/01 Python
借助HTML5 Canvas API制作一个简单的猜字游戏
2016/03/25 HTML / CSS
Under Armour安德玛荷兰官网:美国高端运动科技品牌
2019/07/10 全球购物
三严三实对照检查材料
2014/09/22 职场文书
五好家庭申报材料
2014/12/20 职场文书
2015年“世界无车日”活动方案
2015/05/06 职场文书
小学体育教学随笔
2015/08/14 职场文书
Go Gin实现文件上传下载的示例代码
2021/04/02 Golang
Redis源码阅读:Redis字符串SDS详解
2021/07/15 Redis