Узел JS - получить полное доменное имя [закрыто]

8

Как я могу получить FQDN (полное доменное имя) машины, на которой работает узел?

os.gethostname()недостаточно, поскольку обычно возвращает только неквалифицированное DN. То же самое, dns.reverse(ip, callback)если предположить, что ip связан с именем хоста, например, получен с использованием dns.lookup(os.gethostname()[, options], callback).

Кроме того, выполнение a shell.exec("hostname -f", { silent: true }, cb)не является опцией, поскольку оно не соответствует POSIX и, таким образом, не будет работать, например, в Solaris et. al., и это действительно плохой взлом, поскольку exec () - очень, очень дорогой вызов по сравнению с. ресурсы, такие как RAM и CPU (вызывает переключение контекста).

jelmd
источник
$(hostname).$(domainname)будет работать как на Solaris, так и на Linux. Но Solaris POSIX не только сертифицирован POSIX! Это больше POSIX, чем Linux.
Будет
3
Я голосую за то, чтобы закрыть этот вопрос как не по теме, потому что его следовало перенести в SO
Anthon

Ответы:

10

Хитрость заключается в том, чтобы использовать 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 используется в примере, чтобы показать, что это не влияет на результат (по умолчанию для этого порта не определена служба).

jelmd
источник