linux下获得本机mac地址函数

QString GetLocalMac()
{
int sock_mac;

struct ifreq ifr_mac;
char mac_addr[30];

sock_mac = socket( AF_INET, SOCK_STREAM, 0 );
if( sock_mac == -1)
{
perror("create socket falise...mac/n");
return "";
}

memset(&ifr_mac,0,sizeof(ifr_mac));
strncpy(ifr_mac.ifr_name, "eth0", sizeof(ifr_mac.ifr_name)-1);

if( (ioctl( sock_mac, SIOCGIFHWADDR, &ifr_mac)) < 0)
{
printf("mac ioctl error/n");
return "";
}

sprintf(mac_addr,"%02x%02x%02x%02x%02x%02x",
(unsigned char)ifr_mac.ifr_hwaddr.sa_data[0],
(unsigned char)ifr_mac.ifr_hwaddr.sa_data[1],
(unsigned char)ifr_mac.ifr_hwaddr.sa_data[2],
(unsigned char)ifr_mac.ifr_hwaddr.sa_data[3],
(unsigned char)ifr_mac.ifr_hwaddr.sa_data[4],
(unsigned char)ifr_mac.ifr_hwaddr.sa_data[5]);

printf("local mac:%s /n",mac_addr);

close( sock_mac );
return QString( mac_addr );
}

<think>好的,我需要回答用户关于在Linux系统中获取本机MAC地址的方法。用户提到了函数或脚本示例,根据提供的引用,特别是引用[3],里面提到了使用C语言和shell脚本的方法。首先,我需要确认有哪些常见的方法,比如使用命令行工具或者编写脚本。 首先,想到的是使用ifconfig命令,不过现在可能推荐使用ip命令。另外,用户可能需要不同语言的示例,比如Shell脚本或者C语言。引用[3]中的C代码示例可能有用,但用户可能更倾向于脚本。需要检查是否有更简洁的方法。 在Shell脚本中,可以通过解析/sys/class/net下的文件来获取MAC地址,或者使用ip link命令。例如,过滤出eth0或ens33等接口的MAC地址。需要确保示例代码正确,并且兼容不同的发行版。 另外,用户可能希望避免依赖外部工具,直接读取系统文件。例如,读取/sys/class/net/eth0/address文件的内容。这种方法简单且高效,适用于脚本。 还需要考虑多个网络接口的情况,可能需要遍历所有接口或指定特定接口。在示例中给出基本的方法,并提示用户根据需要调整接口名。 最后,确保引用正确的来源,引用[3]提到了StackOverflow的代码,需要正确标注引用标识。同时检查是否有其他相关引用,但当前提供的引用中主要参考引用[3]的内容。 总结步骤:1. 使用Shell命令如ip或ifconfig;2. 编写Shell脚本解析输出;3. 使用C语言通过getifaddrs函数获取;4. 直接读取系统文件。需要给出每种方法的示例,并标注引用。</think>在Linux系统中获取本机MAC地址可通过多种方式实现,以下是具体方法和示例: ### 一、Shell脚本方法 1. **使用 `ip link` 命令** ```bash # 获取指定网卡(如eth0)的MAC地址 mac=$(ip link show eth0 | awk '/link\/ether/{print $2}') echo "MAC地址: $mac" ``` 2. **解析 `/sys/class/net` 系统文件** ```bash # 直接读取系统文件(适用于所有接口) interface="eth0" mac=$(cat /sys/class/net/$interface/address) echo "接口 $interface 的MAC地址: $mac" ``` ### 二、C语言函数实现 通过 `getifaddrs` 函数获取网络接口信息(需包含头文件 `<ifaddrs.h>`): ```c #include <stdio.h> #include <ifaddrs.h> #include <net/if.h> int main() { struct ifaddrs *ifaddr, *ifa; if (getifaddrs(&ifaddr) == -1) { perror("getifaddrs"); return 1; } for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) { if (ifa->ifa_addr && ifa->ifa_addr->sa_family == AF_PACKET) { struct sockaddr_ll *s = (struct sockaddr_ll*)ifa->ifa_addr; printf("接口 %s 的MAC地址: %02x:%02x:%02x:%02x:%02x:%02x\n", ifa->ifa_name, s->sll_addr[0], s->sll_addr[1], s->sll_addr[2], s->sll_addr[3], s->sll_addr[4], s->sll_addr[5]); } } freeifaddrs(ifaddr); return 0; } ``` 此代码会遍历所有网络接口并输出MAC地址,参考了StackOverflow的实现思路[^3]。 ### 三、Python脚本示例 ```python import os def get_mac(interface='eth0'): mac_path = f'/sys/class/net/{interface}/address' if os.path.exists(mac_path): with open(mac_path, 'r') as f: return f.read().strip() return None print("MAC地址:", get_mac()) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值