如何获取运行节点的计算机的 FQDN(完全限定域名)?
os.gethostname()
是不够的,因为它通常只返回不合格的 DN。同样的事情dns.reverse(ip, callback)
- 假设 ip 是与主机名关联的 IP,例如使用dns.lookup(os.gethostname()[, options], callback)
.
另外,做 ashell.exec("hostname -f", { silent: true }, cb)
也不是一个选择,因为它是不符合 POSIX 标准因此会失败,例如在 Solaris 等上。等,这是一个非常糟糕的黑客,因为 exec() 是一个非常非常昂贵的请致电。 RAM 和 CPU 等资源(导致上下文切换)。
答案1
诀窍是利用getnameinfo(...)
操作系统通常通过 libc.so 或 libsocket.so 提供的功能,因为它默认执行 FQDN 查找!因为dns.lookupService(address, port, callback)
似乎是唯一有记录的nodeJS核心函数,它“包装”了它,所以我们需要使用这个。例如:
var os = require('os');
var dns = require('dns');
var h = os.hostname();
console.log('UQDN: ' + h);
dns.lookup(h, { hints: dns.ADDRCONFIG }, function(err, ip) {
console.log('IP: ' + ip);
dns.lookupService(ip, 0, function (err, hostname, service) {
if (err) {
console.log(err);
return;
}
console.log('FQDN: ' + hostname);
console.log('Service: ' + service);
});
});
示例中使用端口 0 是为了表明这对结果没有影响(默认情况下没有为此端口定义服务)。