无法使用 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 地址的主要内容,如果未能解决你的问题,请参考以下文章

使用 SIOCSIFADDR ioctl 设置 IP 地址

怎么改手机MAC地址?

使用 AMPP 在 Mac 上更改了 phpmyadmin 密码,现在无法登录 phpmyadmin

使用 ioctl 修改 IP 地址时的不良副作用

使用 XAMPP 在 Mac 上更改 phpMyAdmin 中的密码,现在无法访问 localhost/phpmyadmin

opencv 无法停止流:设备的 ioctl 不合适