无法使用 ioctl 更改 mac 地址
Unable to change mac address using ioctl
最近我对如何使用低级方法在 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" 变量是一个 char**,当我初始化一个新接口时,我在其中存储接口名称,并在该函数中将名称存储在该变量中,我' m return将 int 作为处理程序。
在更改 mac 地址之前,从代码中我放下了界面。
现在,当我调用 ioctl 以使用 SIOCSIFHWADDR ioctl return -1.
更改 mac 地址时
谁能帮帮我?对不起英语
SIOCGIFHWADDR, SIOCSIFHWADDR
Get or set the hardware address of a device using ifr_hwaddr.
The hardware address is specified in a struct sockaddr.
sa_family contains the ARPHRD_* device type, sa_data the L2
hardware address starting from byte 0. Setting the hardware
address is a privileged operation.
所以,你需要一些东西来改变 MAC:
- ifr_name(必须是空终止字符串)
- sa_family包含ARPHRD_*设备类型(填写get_hwaddr()?)
- sa_data从字节0开始的L2硬件地址(完成)
- 设置硬件地址是特权操作(sudo)
由于您在评论中确认您 运行 它在主机上使用 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
最近我对如何使用低级方法在 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" 变量是一个 char**,当我初始化一个新接口时,我在其中存储接口名称,并在该函数中将名称存储在该变量中,我' m return将 int 作为处理程序。
在更改 mac 地址之前,从代码中我放下了界面。
现在,当我调用 ioctl 以使用 SIOCSIFHWADDR ioctl return -1.
更改 mac 地址时谁能帮帮我?对不起英语
SIOCGIFHWADDR, SIOCSIFHWADDR
Get or set the hardware address of a device using ifr_hwaddr. The hardware address is specified in a struct sockaddr. sa_family contains the ARPHRD_* device type, sa_data the L2 hardware address starting from byte 0. Setting the hardware address is a privileged operation.
所以,你需要一些东西来改变 MAC:
- ifr_name(必须是空终止字符串)
- sa_family包含ARPHRD_*设备类型(填写get_hwaddr()?)
- sa_data从字节0开始的L2硬件地址(完成)
- 设置硬件地址是特权操作(sudo)
由于您在评论中确认您 运行 它在主机上使用 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