gpt4 book ai didi

python - 如何调用 SIOCSIFHWADDR ioctl 来更改 Python 中的 MAC 地址?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:25:18 26 4
gpt4 key购买 nike

所以我有创建 Linux TAP 接口(interface)的 Python 代码,但它总是会提供一个随机的、自动生成的 MAC 地址。为了简化测试,我想在接口(interface)初始化后手动为其分配一个 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 字段,但这是一个 union 我不确定如何在 Python 中创建结构。

struct ifreq 调用 SIOCSIFHWADDR ioctl 以在 Python 中更改接口(interface)的 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)

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

关于python - 如何调用 SIOCSIFHWADDR ioctl 来更改 Python 中的 MAC 地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6154846/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com