[javascript] node.js에서 로컬 IP 주소 가져 오기

내 컴퓨터에서 실행중인 간단한 node.js 프로그램이 있고 프로그램이 실행되는 PC의 로컬 IP 주소를 얻고 싶습니다. node.js로 어떻게 얻습니까?



답변

'use strict';

var os = require('os');
var ifaces = os.networkInterfaces();

Object.keys(ifaces).forEach(function (ifname) {
  var alias = 0;

  ifaces[ifname].forEach(function (iface) {
    if ('IPv4' !== iface.family || iface.internal !== false) {
      // skip over internal (i.e. 127.0.0.1) and non-ipv4 addresses
      return;
    }

    if (alias >= 1) {
      // this single interface has multiple ipv4 addresses
      console.log(ifname + ':' + alias, iface.address);
    } else {
      // this interface has only one ipv4 adress
      console.log(ifname, iface.address);
    }
    ++alias;
  });
});

// en0 192.168.1.101
// eth0 10.0.0.101


답변

os.networkInterfaces는 현재 Windows에서 작동하지 않습니다. 결과를 파싱하기 위해 프로그램을 실행하는 것은 다소 불편한 것 같습니다. 여기 내가 사용하는 것이 있습니다.

require('dns').lookup(require('os').hostname(), function (err, add, fam) {
  console.log('addr: '+add);
})

첫 번째 네트워크 인터페이스 로컬 IP를 반환해야합니다.


답변

https://github.com/indutny/node-ip

var ip = require("ip");
console.dir ( ip.address() );


답변

os 모듈 을 사용하여 찾을 수있는 시스템의 모든 IP – NodeJS 고유

var os = require( 'os' );

var networkInterfaces = os.networkInterfaces( );

console.log( networkInterfaces );

os.networkInterfaces ()를 호출하기 만하면 쉽게 관리 할 수있는 목록을 얻을 수 있습니다. 리그로 ifconfig 를 실행하는 것보다 쉽습니다.

http://nodejs.org/api/os.html#os_os_networkinterfaces

베스트

에도아르도


답변

다음은 ifconfig발견 된 첫 번째 IP 주소 의 출력을 구문 분석 하고 (비동기 적으로) 반환하는 node.js 코드 스 니펫입니다 .

(MacOS Snow Leopard에서만 테스트되었으며 Linux에서도 작동하기를 바랍니다)

var getNetworkIP = (function () {
    var ignoreRE = /^(127\.0\.0\.1|::1|fe80(:1)?::1(%.*)?)$/i;

    var exec = require('child_process').exec;
    var cached;
    var command;
    var filterRE;

    switch (process.platform) {
    // TODO: implement for OSs without ifconfig command
    case 'darwin':
         command = 'ifconfig';
         filterRE = /\binet\s+([^\s]+)/g;
         // filterRE = /\binet6\s+([^\s]+)/g; // IPv6
         break;
    default:
         command = 'ifconfig';
         filterRE = /\binet\b[^:]+:\s*([^\s]+)/g;
         // filterRE = /\binet6[^:]+:\s*([^\s]+)/g; // IPv6
         break;
    }

    return function (callback, bypassCache) {
         // get cached value
        if (cached && !bypassCache) {
            callback(null, cached);
            return;
        }
        // system call
        exec(command, function (error, stdout, sterr) {
            var ips = [];
            // extract IPs
            var matches = stdout.match(filterRE);
            // JS has no lookbehind REs, so we need a trick
            for (var i = 0; i < matches.length; i++) {
                ips.push(matches[i].replace(filterRE, '$1'));
            }

            // filter BS
            for (var i = 0, l = ips.length; i < l; i++) {
                if (!ignoreRE.test(ips[i])) {
                    //if (!error) {
                        cached = ips[i];
                    //}
                    callback(error, ips[i]);
                    return;
                }
            }
            // nothing found
            callback(error, null);
        });
    };
})();

사용 예 :

getNetworkIP(function (error, ip) {
    console.log(ip);
    if (error) {
        console.log('error:', error);
    }
}, false);

두 번째 매개 변수가 true이면이 함수는 매번 시스템 호출을 실행합니다. 그렇지 않으면 캐시 된 값이 사용됩니다.


업데이트 된 버전

모든 로컬 네트워크 주소의 배열을 반환합니다.

Ubuntu 11.04 및 Windows XP 32에서 테스트

var getNetworkIPs = (function () {
    var ignoreRE = /^(127\.0\.0\.1|::1|fe80(:1)?::1(%.*)?)$/i;

    var exec = require('child_process').exec;
    var cached;
    var command;
    var filterRE;

    switch (process.platform) {
    case 'win32':
    //case 'win64': // TODO: test
        command = 'ipconfig';
        filterRE = /\bIPv[46][^:\r\n]+:\s*([^\s]+)/g;
        break;
    case 'darwin':
        command = 'ifconfig';
        filterRE = /\binet\s+([^\s]+)/g;
        // filterRE = /\binet6\s+([^\s]+)/g; // IPv6
        break;
    default:
        command = 'ifconfig';
        filterRE = /\binet\b[^:]+:\s*([^\s]+)/g;
        // filterRE = /\binet6[^:]+:\s*([^\s]+)/g; // IPv6
        break;
    }

    return function (callback, bypassCache) {
        if (cached && !bypassCache) {
            callback(null, cached);
            return;
        }
        // system call
        exec(command, function (error, stdout, sterr) {
            cached = [];
            var ip;
            var matches = stdout.match(filterRE) || [];
            //if (!error) {
            for (var i = 0; i < matches.length; i++) {
                ip = matches[i].replace(filterRE, '$1')
                if (!ignoreRE.test(ip)) {
                    cached.push(ip);
                }
            }
            //}
            callback(error, cached);
        });
    };
})();

업데이트 된 버전의 사용 예

getNetworkIPs(function (error, ip) {
console.log(ip);
if (error) {
    console.log('error:', error);
}
}, false);


답변

IPv4 주소를 찾고 있고 컴퓨터에 실제 네트워크 인터페이스가 하나만 있다고 가정하면 로컬 IP 주소를 얻는 유틸리티 방법은 다음과 같습니다. 다중 인터페이스 시스템에 대한 IP 배열을 반환하도록 쉽게 리팩토링 할 수 있습니다.

function getIPAddress() {
  var interfaces = require('os').networkInterfaces();
  for (var devName in interfaces) {
    var iface = interfaces[devName];

    for (var i = 0; i < iface.length; i++) {
      var alias = iface[i];
      if (alias.family === 'IPv4' && alias.address !== '127.0.0.1' && !alias.internal)
        return alias.address;
    }
  }

  return '0.0.0.0';
}


답변

ip와 같은 모듈을 설치하십시오.

npm install ip

그런 다음이 코드를 사용하십시오.

var ip = require("ip");
console.log( ip.address() );