【问题标题】:How to call SIOCSIFHWADDR ioctl to change MAC address in Python?如何在 Python 中调用 SIOCSIFHWADDR ioctl 更改 MAC 地址?
【发布时间】:2011-05-27 16:01:50
【问题描述】:

所以我有创建 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中创建结构。

struct ifreq 调用SIOCSIFHWADDR ioctl 以在Python 中更改接口的MAC 地址的最佳方法是什么?

谢谢!

【问题讨论】:

  • 你想用 Python 还是 C 来做?
  • 在 Python 中,我的主要问题是构建传递给 ioctl 的结构。

标签: python c linux


【解决方案1】:

来自: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)

我使用了该模块中的很多网络方法;很有用!

【讨论】:

  • 我希望我以前知道那个模块。谢谢!
【解决方案2】:

union 仅表示考虑内容的方式有多种。你只对一个感兴趣,这个:

struct ifreq_set_hwaddr
{
# define IFHWADDRLEN    6
# define IFNAMSIZ       IF_NAMESIZE
    char ifrn_name[IFNAMSIZ];       /* Interface name, e.g. "en0".  */
    struct sockaddr ifru_hwaddr;
};

请注意,我假设struct sockaddr 与其他工会成员具有相同(或最严格)的对齐要求。如果没有,您可能需要一些填充。

【讨论】:

    【解决方案3】:

    您将 /sbin/ip 作为子进程生成,例如

    /sbin/ip link set dev dummy0 address 02:23:45:67:89:ab
    

    这样可以省去很多麻烦。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-14
      相关资源
      最近更新 更多