简体   繁体   English

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

[英]get the mac address of the current machine with node.js using getmac

I am working on this question .我正在研究这个问题

Now I am trying to use getmac现在我正在尝试使用getmac

to get the mac address of the current machine with node.js.用node.js获取当前机器的mac地址。

I followed the installation instructions.我按照安装说明进行操作。 But when I run this code:但是当我运行这段代码时:

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

I get this error:我收到此错误:

Error: Command failed: the command "getmac" could not be found错误:命令失败:找不到命令“getmac”

Do you know how to get this to work?你知道如何让这个工作吗?

On NodeJS ≥ 0.11 the mac address for each network interface is in the output of os.networkInterfaces() , eg在 NodeJS ≥ 0.11 上,每个网络接口的 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 } ] }

In NodeJS ≤ 0.10 you need to find out the mac addresses on your own, but there are packages to help you with that: node-macaddress (disclaimer: I am the author of said package).在 NodeJS ≤ 0.10 中,您需要自己找出 mac 地址,但是有一些软件包可以帮助您解决这个问题: node-macaddress (免责声明:我是该软件包的作者)。

This package also selects one interface for your host so that you can do just该软件包还为您的主机选择了一个接口,以便您可以只做

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

On node ≥ 0.11 you are not required to use the asynchronous version:在节点 ≥ 0.11 上,您不需要使用异步版本:

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

Since you are typically only interested in "the hosts macaddress" (although there is no such thing as a host can have multiple network interfaces each having an individual mac address), this call will give you exactly that.由于您通常只对“主机 macaddress”感兴趣(尽管没有主机可以有多个网络接口,每个接口都有一个单独的 mac 地址),因此此调用将为您提供准确的信息。

A Node.JS script can discover the MAC address of the current machine by examining the link-local IPv6 address. Node.JS 脚本可以通过检查本地链路 IPv6 地址来发现当前机器的 MAC 地址。 (caveat: this requires the IPv6 stack to be active within the O/S, which is increasingly common) (警告:这要求 IPv6 堆栈在 O/S 中处于活动状态,这越来越普遍)

eg例如

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

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

  1. remove the 0xfffe from the middle从中间删除 0xfffe
  2. bitwise invert bit#41 using XOR 0x020000000000使用 XOR 0x020000000000 按位反转位#41

On Windows it is necessary to deactivate randomizeidentifiers by running the elevated command:在 Windows 上,有必要通过运行提升的命令来停用 randomizeidentifiers:

netsh interface ipv6 set global randomizeidentifiers=disabled

The following code uses this technique to generate a Variant 1 UUID (tail generation happens just once):以下代码使用此技术生成 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('-');
};

You need to install getmac node_module using npm install getmac in command prompt/terminal.您需要在命令提示符/终端中使用npm install getmac安装getmac node_module。 Then, it will work.然后,它将起作用。

install the package getmac using the terminal.使用终端安装包getmac

npm install --save getmac

using in node在节点中使用

const getmac = require('getmac')

const callMac = () =>{
    return getmac.default()
}

output >> "00:05:1b:61:d3:05"输出>>“00:05:1b:61:d3:05”

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM