无法使用 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 地址时

谁能帮帮我?对不起英语

看看netdevice(7) man page:

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:

  1. ifr_name(必须是空终止字符串)
  2. sa_family包含ARPHRD_*设备类型(填写get_hwaddr()?)
  3. sa_data从字节0开始的L2硬件地址(完成)
  4. 设置硬件地址是特权操作(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