Можно ли получить уникальный идентификатор машинного сервера с помощью node.js?

Я хотел бы знать, есть ли способ NODE получить MAC-адрес сервера, на котором он запущен.

Ответ 1

Node не имеет встроенного доступа для доступа к этим низкоуровневым данным.

Однако вы можете выполнить ifconfig и проанализировать его вывод или написать расширение С++ для node, которое предоставляет функцию для получения адреса mac. Еще проще: /sys/class/net/eth?/address:

var fs = require('fs'),
    path = require('path');
function getMACAddresses() {
    var macs = {}
    var devs = fs.readdirSync('/sys/class/net/');
    devs.forEach(function(dev) {
        var fn = path.join('/sys/class/net', dev, 'address');
        if(dev.substr(0, 3) == 'eth' && fs.existsSync(fn)) {
            macs[dev] = fs.readFileSync(fn).toString().trim();
        }
    });
    return macs;
}

console.log(getMACAddresses());

Функция возвращает объект, содержащий адреса mac всех устройств eth*. Если вы хотите, чтобы все устройства имели один, даже если они есть, например, называется wlan*, просто удалите проверку dev.substr(0, 3) == 'eth'.

Ответ 2

Если вы просто ищете уникальный идентификатор сервера, вы можете использовать подход mongodb/bson и использовать первые n байтов хеша md5 имени хоста сервера:

var machineHash = crypto.createHash('md5').update(os.hostname()).digest('binary');

Этот код от node-buffalo. Не идеально, но может быть достаточно хорошим в зависимости от того, что вы пытаетесь сделать.

Ответ 3

Я попробовал getmac, но для меня это не сработало (node v0.10, Mac OS X) - так Я изложил и построил свой собственный: https://github.com/scravy/node-macaddress. Он работает в Windows, OS X, Linux и, возможно, в каждом unix с ifconfig: -)

Ответ 4

Вот код node.js с помощью инструментов командной строки для получения MAC-адреса:

`$ ifconfig | grep eth0 | awk '{print $5}'`

для wlan0

`$ ifconfig | grep wlan0 | awk '{print $5}'`

В node.js, используйте это - сохраните код для getMAC.js - "$ node getMAC.js" для запуска

`// Get MAC address - $ ifconfig | grep wlan0 | awk '{print $5}'
 var exec = require('child_process').exec;
 function puts(error, stdout, stderr) { console.log(stdout) }
 exec("ifconfig | grep wlan0 | awk '{print $5}'", puts);
 `

Ответ 5

Полный ответ ниже, но в основном вы можете получить эту информацию в vanilla node.js через:

require('os').networkInterfaces()

Это дает вам всю информацию о сетевых устройствах в системе, включая MAC-адреса для каждого интерфейса.

Вы можете дополнительно сузить это до просто MACS:

JSON.stringify(  require('os').networkInterfaces(),  null,  2).match(/"mac": ".*?"/g)

И далее, на чистые MAC-адреса:

JSON.stringify(  require('os').networkInterfaces(),  null,  2).match(/"mac": ".*?"/g).toString().match(/\w\w:\w\w:\w\w:\w\w:\w\w:\w\w/g)

Этот последний даст вам подобный массиву объект соответствия в форме:

['00: 00: 00: 00: 00: 00 ',' A8: AE: B6: 58: C5: 09 ',' FC: E3: 5A: 42: 80: 18 ']

Первый элемент - это ваш локальный или локальный интерфейс.

Я случайно сгенерировал остальные для публичного примера, используя https://www.miniwebtool.com/mac-address-generator/

Если вы хотите быть более "правильным" (или разбить его на более простые для понимания шаги):

var os = require('os');

var macs = ()=>{
  return JSON.stringify(  os.networkInterfaces(),  null,  2)
    .match(/"mac": ".*?"/g)
    .toString()
    .match(/\w\w:\w\w:\w\w:\w\w:\w\w:\w\w/g)
  ;
}


console.log( macs() );

По сути, вы берете объект данных интерфейса и преобразуете его в текстовую строку JSON.. вы получаете объект соответствия для адресов MAC и конвертируете его в текстовую строку. Затем вы извлекаете только MAC-адреса в итеративный объект сопоставления, который содержит только каждый MAC-адрес в каждом элементе.

Есть несколько более кратких способов сделать это, но этот надежный и легко читаемый.