Nodo JS: obtener FQDN [cerrado]


8

¿Cómo puedo obtener el FQDN (nombre de dominio completo) de la máquina en la que se ejecuta el nodo?

os.gethostname()no es suficiente, ya que generalmente solo devuelve el DN no calificado. Lo mismo para dns.reverse(ip, callback): suponiendo que la ip es la asociada con el nombre de host, por ejemplo, obtenida usando dns.lookup(os.gethostname()[, options], callback).

Tampoco shell.exec("hostname -f", { silent: true }, cb)es una opción, ya que no es compatible con POSIX y, por lo tanto, fallará, por ejemplo, en Solaris et. al., y es un hack realmente malo, ya que exec () es una llamada muy, muy costosa wrt. recursos como RAM y CPU (provoca cambio de contexto).


$(hostname).$(domainname)funcionará tanto en Solaris como en Linux. Pero, no solo es Solaris POSIX, ¡tiene certificación POSIX! Es más POSIX que Linux.
Será

3
Estoy votando para cerrar esta pregunta como fuera de tema porque esto debería haberse trasladado a SO
Anthon

Respuestas:


10

El truco consiste en utilizar la getnameinfo(...)función proporcionada por el sistema operativo generalmente a través de libc.so o libsocket.so, ¡ya que realiza una búsqueda de FQDN por defecto! Debido a que dns.lookupService(address, port, callback)parece ser la única función central documentada de nodeJS, que la "envuelve", necesitamos usar esta. P.ej:

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);
    });
});

El puerto 0 se usa en el ejemplo para mostrar que esto no tiene influencia en el resultado (por defecto no hay un servicio definido para este puerto).

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.