2013-05-05 12 views
5

Sto lavorando su this question.ottenere l'indirizzo mac della macchina corrente con node.js utilizzando getmac

Ora sto cercando di usare getmac

per ottenere l'indirizzo MAC della macchina corrente con node.js.

Ho seguito le istruzioni di installazione. Ma quando si esegue questo codice:

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

ottengo questo errore:

errore: Comando non riuscito: il comando "getmac" non è stato trovato

Sai come ottenere questo a lavoro?

+0

Er ... quale piattaforma e come la gestisci? –

+0

Hai installato il modulo? 'npm install getmac'? – drinchev

+0

@JoachimIsaksson node version 0.8.16 –

risposta

-1

È necessario eseguirlo con utente root o comando.

+0

Non hai fornito esempi, script o suggerimenti accurati e * eseguilo come root * isn è abbastanza necessario per ottenere l'indirizzo MAC di un computer. – ArchNoob

3

Uno script Node.JS può rilevare l'indirizzo MAC della macchina corrente esaminando l'indirizzo IPv6 locale di collegamento. (avvertenza: questo richiede che lo stack IPv6 sia attivo all'interno del sistema operativo, che è sempre più comune)

ad es.

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

Sulla base http://en.wikipedia.org/wiki/IPv6_address#Modified_EUI-64

  1. rimuovere il 0xFFFE dalla metà
  2. bit a bit po 'invertito # 41 utilizza XOR 0x020000000000

Su Windows è necessario disattivare randomizeidentifiers eseguendo il comando elevato:

netsh interface ipv6 set global randomizeidentifiers=disabled 

Il codice seguente utilizza questa tecnica per generare una variante 1 UUID (generazione di coda avviene solo una volta):

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('-'); 
}; 
9

Su NodeJS ≥ 0,11 l'indirizzo MAC per ogni interfaccia di rete è nella produzione di os.networkInterfaces(), ad esempio

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 è necessario scoprire gli indirizzi MAC da soli, ma ci sono pacchetti per aiutarvi con che: node-macaddress (disclaimer: io sono l'autore della detta confezione).

Questo pacchetto seleziona anche un'interfaccia per il vostro ospite in modo che si può fare proprio

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

Nel nodo ≥ 0,11 non è necessario utilizzare la versione asincrona:

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

Dal momento che sei in genere interessa solo "l'host macaddress" (anche se non esiste una cosa come un host può avere più interfacce di rete ciascuna con un indirizzo MAC individuale), questa chiamata ti darà esattamente questo.

+0

Questo smesso di funzionare subito dopo 8.0.0. attualmente 8.1.3 restituisce ancora zeri per il mac nel dispositivo (non locale). Ha bisogno di patch fino a quando non ottengono il loro codice 8.0.0 in ordine ?! ip addr darà un collegamento/etere ma qualcos'altro sarebbe meglio. –

2

È necessario installare getmac node_module utilizzando npm installare getmac nel prompt dei comandi/terminale. Quindi funzionerà.

+0

Sì, questo funziona per me, grazie @Pavani –