使用getmac获取当前机器的mac地址和node.js

我正在研究这个问题 。

现在我正在尝试使用getmac

node.js获取当前机器的mac地址

我遵循安装说明。 但是当我运行这个代码:

require('getmac').getMac(function(err,macAddress){ if (err) throw err; console.log(macAddress); }); 

我得到这个错误:

错误:命令失败:无法find命令“getmac”

你知道如何让这个工作?

       

网上收集的解决方案 "使用getmac获取当前机器的mac地址和node.js"

os.networkInterfaces() ,每个networking接口的mac地址都在os.networkInterfaces()的输出中,例如

 require('os').networkInterfaces() { eth0: [ { address: 'fe80::cae0:ebff:fe14:1dab', netmask: 'ffff:ffff:ffff:ffff::', family: 'IPv6', mac: 'c8:e0:eb:14:1d:ab', scopeid: 4, internal: false }, { address: '192.168.178.22', netmask: '255.255.255.0', family: 'IPv4', mac: 'c8:e0:eb:14:1d:ab', internal: false } ] } 

在NodeJS≤0.10中,你需要自己找出MAC地址,但是有一些软件包可以帮助你: node-macaddress (声明:我是这个包的作者)。

该软件包还为您的主机select一个接口,以便您可以做到

 require('node-macaddress').one(function (err, addr) { console.log(addr); } 

在节点≥0.11上,不需要使用asynchronous版本:

 var addr = require('node-macaddress').one(); 

既然你通常只对“主机macaddress”感兴趣(虽然没有这样的东西,主机可以有多个networking接口,每个都有一个单独的mac地址),这个电话会给你完全的。

Node.JS脚本可以通过检查链路本地IPv6地址来发现当前机器的MAC地址。 (警告:这要求IPv6栈在O / S内是活跃的,这是越来越常见的)

例如

 LL: fe80::0211:22ff:fe33:4455 MAC: 0011:22 33:4455 

基于http://en.wikipedia.org/wiki/IPv6_address#Modified_EUI-64

  1. 从中间删除0xfffe
  2. 按位反转位#41使用异或0x020000000000

在Windows上,需要通过运行提升的命令来closuresrandomizeidentifiers:

 netsh interface ipv6 set global randomizeidentifiers=disabled 

下面的代码使用这种技术来生成一个Variant 1 UUID(尾部生成只发生一次):

 function generateUUID() { generateUUID.tail = generateUUID.tail || (function(nics) { var nic, index, addr, retn; for (nic in nics) { // try to obtain the MAC address from the IPv6 scope-local address for (index in nics[nic]) { addr = nics[nic][index]; if (!addr.internal) { if (addr.address.indexOf('fe80::') === 0) { // found scope-local retn = retn || addr.address.slice(6).split(/:/).map(function(v, i, a) { return parseInt(v, 16); }); } } } } if (!retn) { // no IPv6 so generate random MAC with multicast bit set index = Math.pow(2, 16); retn = []; retn.push(Math.floor(Math.random() * index) | 0x1000); // set multicast bit retn.push(Math.floor(Math.random() * index)); retn.push(Math.floor(Math.random() * index)); retn.push(Math.floor(Math.random() * index)); } retn[3] = 0x10000 | retn[3]; retn[2] = 0x10000 | retn[1] & 0xff00 | retn[2] & 0x00ff; // eliminate FFFE from xxxx:xxFF:FExx:xxxx retn[1] = 0x10000 | retn[0] ^ 0x0200; // invert bit#41 retn[0] = 0x18000 | process.pid & 0x3fff; retn = retn.map(function(v, i, a) { return v.toString(16).slice(1) }); return retn[0] + '-' + retn[1] + retn[2] + retn[3]; })(require('os').networkInterfaces()); var head = process.hrtime(), now = Math.floor(Date.now() / 1000); head[1] = Math.floor(head[1] * 0.268435456); // 2^28 / 10^9 head[2] = (0x11000 | head[1] & 0x0fff).toString(16).slice(1); head[1] = (0x10000 | head[1] >>> 12 & 0xffff).toString(16).slice(1); head[0] = (4294967296 + now).toString(16).slice(1); return head.concat(generateUUID.tail).join('-'); }; 

您需要在命令提示符/terminal中使用npm install getmac安装getmac node_module。 那么,它会工作。

您必须以root用户或命令运行它。