如何在Python中调用SIOCSIFHWADDR ioctl更改MAC地址?

问题描述

| 因此,我有创建Linux TAP接口的Python代码,但是它总是带有一个随机的,自动生成的MAC地址。为了简化测试,我想在接口初始化后手动为接口分配一个MAC地址。我知道我可以用
SIOCSIFHWADDR
ioctl和
struct ifreq
做到这一点,但是我对实现有一些疑问。 这是C结构:
struct ifreq
{
# define IFHWADDRLEN    6
# define IFNAMSIZ       IF_NAMESIZE
union
  {
    char ifrn_name[IFNAMSIZ];       /* Interface name,e.g. \"en0\".  */
  } ifr_ifrn;

union
  {
    struct sockaddr ifru_addr;
    struct sockaddr ifru_dstaddr;
    struct sockaddr ifru_broadaddr;
    struct sockaddr ifru_netmask;
    struct sockaddr ifru_hwaddr;
    short int ifru_flags;
    int ifru_ivalue;
    int ifru_mtu;
    struct ifmap ifru_map;
    char ifru_slave[IFNAMSIZ];      /* Just fits the size */
    char ifru_newname[IFNAMSIZ];
    __caddr_t ifru_data;
  } ifr_ifru;
};
现在我认为我只需要填写
hwaddr
字段,但这是一个联合,我不确定如何在Python中创建结构。 在Python中用ѭ1调用
SIOCSIFHWADDR
ioctl来更改接口的MAC地址的最佳方法是什么? 谢谢!     

解决方法

        来自:http://nullege.com/codes/show/src@p@y@pynetlinux-1.0@pynetlinux@ifconfig.py
def set_mac(self,newmac):
    \'\'\' Set the device\'s mac address. Device must be down for this to
        succeed. \'\'\'
    macbytes = [int(i,16) for i in newmac.split(\':\')]
    ifreq = struct.pack(\'16sH6B8x\',self.name,AF_UNIX,*macbytes)
    fcntl.ioctl(sockfd,SIOCSIFHWADDR,ifreq)
我已经使用了该模块中的许多联网方法。很有用!     ,        “ 7”仅表示有多种方式思考内容。您只对以下一项感兴趣:
struct ifreq_set_hwaddr
{
# define IFHWADDRLEN    6
# define IFNAMSIZ       IF_NAMESIZE
    char ifrn_name[IFNAMSIZ];       /* Interface name,e.g. \"en0\".  */
    struct sockaddr ifru_hwaddr;
};
请注意,我假设ѭ9与其他工会会员具有相同(或最严格)的对齐要求。如果没有,您可能需要一些填充。     ,        您将/ sbin / ip生成为子进程,例如
/sbin/ip link set dev dummy0 address 02:23:45:67:89:ab
这将节省很多麻烦。