Я хотел бы знать, есть ли способ NODE получить MAC-адрес сервера, на котором он запущен.
Можно ли получить уникальный идентификатор машинного сервера с помощью node.js?
Ответ 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-адрес в каждом элементе.
Есть несколько более кратких способов сделать это, но этот надежный и легко читаемый.