I am working on this question.

Now I am trying to use getmac

to get the mac address of the current machine with node.js.

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

Do you know how to get this to work?

8

5 Answers

On NodeJS ≥ 0.11 the mac address for each network interface is in the output of os.networkInterfaces(), e.g.

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).

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:

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.

3

A Node.JS script can discover the MAC address of the current machine by examining the link-local IPv6 address. (caveat: this requires the IPv6 stack to be active within the O/S, which is increasingly common)

e.g.

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

Based on

  1. remove the 0xfffe from the middle
  2. bitwise invert bit#41 using XOR 0x020000000000

On Windows it is necessary to deactivate randomizeidentifiers by running the elevated command:

netsh interface ipv6 set global randomizeidentifiers=disabled 

The following code uses this technique to generate a Variant 1 UUID (tail generation happens just once):

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. Then, it will work.

0

install the package getmac using the terminal.

npm install --save getmac 

using in node

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

output >> "00:05:1b:61:d3:05"

You must run it with root user or command.

1

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy