无法使用 ioctl 更改 mac 地址
Posted
技术标签:
【中文标题】无法使用 ioctl 更改 mac 地址【英文标题】:Unable to change mac address using ioctl 【发布时间】:2017-09-07 10:15:44 【问题描述】:最近我对如何使用低级方法在 linux 中访问和设置网络接口很感兴趣。所以我发现,在网上搜索 ioctl 回调,我学会了如何使用它。我开始写一些东西,但今天我在更改接口的mac地址时遇到了问题。
我使用的代码是:
int change_mac(int handler)
srand(times(NULL));
get_hwaddr(handler,&req);
for(int i=0;i<6;i++)
req.ifr_hwaddr.sa_data[i]=(char)rand();
char err=ioctl(sock,SIOCSIFHWADDR,&req);
if(err<0)
printf("Problem to change the mac address with a random one\n %i",err);
exit(0);
int get_hwaddr(int handler,struct ifreq* req_a)
if(handler>=current)
return -1;
strncpy(req_a->ifr_name,interfaces[handler],strlen(interfaces[handler]));
if(ioctl(sock,SIOCGIFHWADDR,req_a)<0)
return -2;
为了更好地理解我的代码,“interfaces”变量是一个字符**,当我初始化一个新接口时,我在其中存储接口的名称,并且在将名称存储在该变量中之后的那个函数中,我返回一个 int作为处理程序。
在更改mac地址之前,我从代码中将接口放下。
现在,当我调用 ioctl 来更改 MAC 地址时,SIOCSIFHWADDR ioctl 返回 -1。
谁能帮帮我?对不起英语
【问题讨论】:
更改 MAC 地址?那不是硬件的只读标识符吗? 检查errno
以获取有关实际错误的详细信息。这可能会帮助你
strerror (errno) 总是返回“-1”
您是否有权执行此操作?做的时候界面是不是掉线了?并非所有网络适配器或内核驱动程序都支持更改 MAC 地址,但有些确实支持
是的,因为我使用 sudo 执行它。在调用 change_mac 之前谈论接口的状态我调用 if_down 这是我自己的实现,因为我在调用它 ifconfig 之后使用它来测试它
【参考方案1】:
看看netdevice(7) man page:
SIOCGIFHWADDR、SIOCGIFHWADDR
使用 ifr_hwaddr 获取或设置设备的硬件地址。 硬件地址在 struct sockaddr 中指定。 sa_family 包含 ARPHRD_* 设备类型,sa_data 为 L2 硬件地址从字节 0 开始。设置硬件 address 是一个特权操作。
所以,你需要做一些事情来改变 MAC:
-
ifr_name(必须是 nul 终止的字符串)
sa_family 包含 ARPHRD_* 设备类型(填写 get_hwaddr()?)
sa_data 从字节 0 开始的 L2 硬件地址(完成)
设置硬件地址是特权操作(sudo)
由于您在 cmets 中确认您在主机上使用 sudo 运行它,请确保您的接口名称正确且 nul 终止,即更改行:
strncpy(req_a->ifr_name,interfaces[handler],strlen(interfaces[handler]));
到行:
strncpy(req_a->ifr_name,interfaces[handler],strlen(interfaces[handler]) + 1);
以下是更改 MAC 的代码示例: https://gist.github.com/mad4j/8864135
【讨论】:
以上是关于无法使用 ioctl 更改 mac 地址的主要内容,如果未能解决你的问题,请参考以下文章
使用 AMPP 在 Mac 上更改了 phpmyadmin 密码,现在无法登录 phpmyadmin
使用 XAMPP 在 Mac 上更改 phpMyAdmin 中的密码,现在无法访问 localhost/phpmyadmin