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

Posted

技术标签:

【中文标题】我可以使用 node.js 获取唯一的服务器机器标识符吗?【英文标题】:Can I fetch a unique server machine identifier with node.js? 【发布时间】:2012-06-25 17:55:22 【问题描述】:

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

【问题讨论】:

请参阅this answer 以获得其他建议。 这个包以跨平台的方式完成,并在节点 0.10-0.12 以及 io.js 上进行了测试:github.com/scravy/node-macaddress - 请参阅one() 方法。 试试这个:npmjs.com/package/ee-machine-id 【参考方案1】:

完整的答案在下面,但基本上你可以通过以下方式在 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。

确实有更简洁的方法可以做到这一点,但这种方法可靠且易于阅读。

【讨论】:

【参考方案2】:

这是使用命令行工具获取 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);
 `

【讨论】:

但是如果你关掉wifi的mac地址会是零的集合【参考方案3】:

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

【讨论】:

【参考方案4】:

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

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

此代码来自node-buffalo。不完美,但可能足够好,具体取决于您要执行的操作。

【讨论】:

【参考方案5】:

节点没有内置被访问这种低级数据。

但是,您可以执行 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' 对勾即可。

【讨论】:

ThiefMaster,感谢您的快速响应。 “/sys/class/net/eth?/address”是跨平台的吗? 很可能仅限 linux。它肯定不会在 Windows 上运行,不确定其他操作系统,例如 *BSD。 我最初使用的是 getmac 模块,但它只会从找到的第一个设备返回 mac 地址。就我而言,我需要 wlan0 的 mac 地址,因此能够轻松使用您的代码获取 wlan0 的 mac 地址 Node≥0.11以及iojs会在os.networkInterfaces()的输出中返回mac地址

以上是关于我可以使用 node.js 获取唯一的服务器机器标识符吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用 node.js 和 express 简单地获取请求

如何在 Node.js 中获取现有服务器的实例?

我需要远程调用 mongoexport 并从 node.js 获取结果

通过 Node.js 路由 http 请求

无论如何,我可以在 node.js 中获取 html 正文

在 Node.js 中获取本地 IP 地址