python 使用ioctl() 获得网卡IP 和MAC地址
2015-08-24 18:21
1271 查看
自从使用了Python,便对其爱不释手。听说Python可以做任何你可以想到的事情,前些天看Linux网络的时候,看到了ioctl()这个函数的强大功能,linux下常用工具route和arp命令就是基于这个函数来完成的,只需要设定对应的option即可。那么,问题来了,python中有无类似功能的方法/函数呢,若我想获得某个接口的配置的IP和其MAC地址,使用C写的代码太多了,Python中的fcntl.ioctl()可以妥妥的完成这个任务。下面来点干货吧。
结果如下:
172.16.24.12
C语言的ioctl中使用的常量SIOCGIFADDR, 对应的值为0x8915,对应关系的定义文件在/usr/include/i386-linux-gnu/bits/ioctls.h
截个片段来看一下吧
若是想获得MAC地址,只需要把0x8915换成0x8927,后面的[20:24]换成[18:24],就得到了16进制形式的MAC地址。
#! /usr/bin/env python from fcntl import ioctl import socket import struct import sys sock=socket.socket(socket.AF_INET,socket.SOCK_DGRAM) try: ip=ioctl(sock.fileno(),0x8915,struct.pack('64s','eth0')) ip=socket.inet_ntoa(ip[20:24]) print ip except: print sys.exc_info()
结果如下:
172.16.24.12
C语言的ioctl中使用的常量SIOCGIFADDR, 对应的值为0x8915,对应关系的定义文件在/usr/include/i386-linux-gnu/bits/ioctls.h
截个片段来看一下吧
* Socket configuration controls. */ #define SIOCGIFNAME 0x8910 /* get iface name */ #define SIOCSIFLINK 0x8911 /* set iface channel */ #define SIOCGIFCONF 0x8912 /* get iface list */ #define SIOCGIFFLAGS 0x8913 /* get flags */ #define SIOCSIFFLAGS 0x8914 /* set flags */ #define SIOCGIFADDR 0x8915 /* get PA address */ #define SIOCSIFADDR 0x8916 /* set PA address */ #define SIOCGIFDSTADDR 0x8917 /* get remote PA address */ #define SIOCSIFDSTADDR 0x8918 /* set remote PA address */ #define SIOCGIFBRDADDR 0x8919 /* get broadcast PA address */ #define SIOCSIFBRDADDR 0x891a /* set broadcast PA address */ #define SIOCGIFNETMASK 0x891b /* get network PA mask */ #define SIOCSIFNETMASK 0x891c /* set network PA mask */ #define SIOCGIFMETRIC 0x891d /* get metric */ #define SIOCSIFMETRIC 0x891e /* set metric */ #define SIOCGIFMEM 0x891f /* get memory address (BSD) */ #define SIOCSIFMEM 0x8920 /* set memory address (BSD) */
若是想获得MAC地址,只需要把0x8915换成0x8927,后面的[20:24]换成[18:24],就得到了16进制形式的MAC地址。
相关文章推荐
- python字符串format函数学习
- python-virtualenv安装方法
- 【Python】[IO编程]文件读写,StringIO和BytesIO,操作文件和目录,序列化
- python没有switch,可以用字典来替代
- python闭包以及装饰器
- 分享python的几个学习资源
- WINDOWS安装python3.X遇到的错误解决方法
- 人生苦短,我学python -- 入门篇
- 【Python】关于递进错误indentationerror
- python数据挖掘领域工具包
- python iterator迭代器、yield、container容器和for循环的联系与区别
- python:安装numpy, Scipy,Matplotlib
- 第一章 Python and NLTK
- python-动态特性学习
- ImportError: No module named 'ConfigParser'
- [python] 爬取网站所有的URL
- python核心编程读书笔记
- Python的Logging使用教程
- (原创)输出列表中成员出现的次数(Python技巧)
- python import pands 报错