我可以使用node.js获取唯一的服务器机器标识符吗?

时间:2012-06-23 21:13:42

标签: node.js mac-address

我想知道是否有办法让NODE检索运行它的服务器的MAC地址。

5 个答案:

答案 0 :(得分:7)

节点没有内置功能来访问这种低级数据。

但是,您可以执行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'支票。

答案 1 :(得分:4)

如果您只是寻找唯一的服务器ID,您可以采用mongodb / bson方法并使用服务器主机名的md5哈希的前n个字节:

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

此代码来自node-buffalo。不完美,但可能会很好,取决于你想要做什么。

答案 2 :(得分:2)

我尝试了getmac包,但它对我不起作用(节点v0.10,Mac OS X) - 所以我开始构建我自己的:https://github.com/scravy/node-macaddress。它适用于Windows,OS X,Linux,可能还有ifconfig的每个unix: - )

答案 3 :(得分:0)

这是使用命令行工具获取MAC地址的node.js代码:

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

for 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);
 `

答案 4 :(得分:0)

完整答案还很遥远,但是基本上,您可以通过以下方式在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。

执行此操作的方法非常简洁,但这是可靠且易于阅读的。