我想知道是否有办法让 NODE 检索它正在运行的服务器的 MAC 地址。
5 回答
Node 没有内置的被访问这种低级数据的方法。
但是,您可以执行ifconfig
并解析其输出或为节点编写 C++ 扩展,以提供检索 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());
eth*
该函数返回一个包含所有设备的 MAC 地址的对象。如果您想要所有设备都有一个,即使它们被称为例如wlan*
,只需删除dev.substr(0, 3) == 'eth'
检查。
如果您只是在寻找唯一的服务器 ID,则可以采用 mongodb/bson 方法并使用服务器主机名的 md5 哈希的前 n 个字节:
var machineHash = crypto.createHash('md5').update(os.hostname()).digest('binary');
此代码来自node-buffalo。不完美,但可能足够好,具体取决于您要执行的操作。
完整的答案在下面,但基本上你可以通过以下方式在 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' ]
第一个元素是您的 lo 或本地界面。
我使用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。
确实有更简洁的方法可以做到这一点,但这种方法可靠且易于阅读。
这是使用命令行工具获取 MAC 地址的 node.js 代码:
`$ 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);
`