Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1130165
  • 博文数量: 170
  • 博客积分: 1603
  • 博客等级: 上尉
  • 技术积分: 1897
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-09 15:54
文章分类

全部博文(170)

文章存档

2016年(27)

2015年(21)

2014年(27)

2013年(21)

2012年(7)

2011年(67)

我的朋友

分类: LINUX

2011-11-23 15:38:17

linux下除了常见的工具获取mac地址以外,还可以通过查询
cat /sys/class/net/eth0/address 
来获得mac地址
但是通过ifconfig xxx hw ether xx:xx:xx:xx以后
所有获得的mac地址都是更改过的,如何获得原有网卡的真实ip呢
网上找了下方法
1:redhat下 在 /etc/sysconfig/hwconf里看到有原来的mac地址
2:写代码

c语言获取mac方法
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <sys/types.h>
  4. #include <sys/socket.h>
  5. #include <sys/ioctl.h>
  6. #include <netinet/in.h>
  7. #include <net/if.h>

  8. int main()
  9. {
  10.  int fd;
  11.  struct ifreq ifr;
  12.  fd = socket(AF_INET, SOCK_DGRAM, 0);
  13.  ifr.ifr_addr.sa_family = AF_INET;
  14.  strncpy(ifr.ifr_name, "eth0", IFNAMSIZ-1);
  15.  ioctl(fd, SIOCGIFHWADDR, &ifr);
  16.  close(fd);
  17.  printf("%.2x:%.2x:%.2x:%.2x:%.2x:%.2x\n",
  18.   (unsigned char)ifr.ifr_hwaddr.sa_data[0],
  19.   (unsigned char)ifr.ifr_hwaddr.sa_data[1],
  20.   (unsigned char)ifr.ifr_hwaddr.sa_data[2],
  21.   (unsigned char)ifr.ifr_hwaddr.sa_data[3],
  22.   (unsigned char)ifr.ifr_hwaddr.sa_data[4],
  23.   (unsigned char)ifr.ifr_hwaddr.sa_data[5]);
  24.  return 0;
  25. }
python获取ip,mac方法参考(其实和c的写法基本一样)
  1. import socket,struct,fcntl


  2. def get_hw_address(ifname):
  3.      s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  4.      info = fcntl.ioctl(s.fileno(),0x8927,struct.pack('256s', ifname[:15]))
  5.      hwaddr = []
  6.      print len(info)
  7.      for char in info[18:24]:
  8.          hdigit = '%02x' % struct.unpack('B',char)[0]
  9.          hwaddr.append(hdigit)
  10.      return ':'.join(hwaddr)

  11. def getHwAddr(ifname):
  12.     s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
  13.     info = fcntl.ioctl(s.fileno(), 0x8927, struct.pack('256s', ifname[:15]))
  14.     return ''.join(['%02x:' % ord(char) for char in info[18:24]])[:-1]


  15. print get_hw_address('eth1')
  16. #print getHwAddr('eth1')


经过测试!!c和python的获取的mac都是改变的-v- ,所以上面两个代码找到的mac也不是真实mac
orz,失败鸟

SIOCGIFHWADDR 和 0x8927是一个意思
/usr/include/linux/sockios.h 里有定义
阅读(5514) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~