问题描述
|
因此,我有创建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
这将节省很多麻烦。