Nhận địa chỉ IP cục bộ trong node.js


308

Tôi có một chương trình node.js đơn giản đang chạy trên máy của mình và tôi muốn lấy địa chỉ IP cục bộ của PC mà chương trình của tôi đang chạy. Làm thế nào để tôi có được nó với node.js?


1
thực phẩm cho suy nghĩ hãy kiểm tra joeyh.name/code/moreutilsgithub.com/polotek/procstreams . Tôi không bao giờ rời khỏi nhà mà không có họ.
James

Hãy thử điều này: github.com/indutny/node-ip
Stephen

Câu trả lời:


419
'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

17
var _ = quiries ('gạch dưới'); var ip = _.chain (yêu cầu ('os'). networkInterfaces ()). flatten (). filter (function (val) {return (val.family == 'IPv4' && val.iternal == false)}) .pluck ('địa chỉ'). first (). value (); console.log (ip)
Carter Cole

Dòng thứ sáu sẽ là if( details.family=='IPv4' && details.internal === false ) {nếu bạn chỉ muốn IP bên ngoài.
Arlen Beiler

3
@CarterCole bạn cần thêm một cuộc gọi đến .values ​​() trước khi làm phẳng.
Guido

1
Nếu tôi chỉ muốn lấy địa chỉ IP của giao diện hoạt động thì sao?
Tejas

1
one-liner mà không lodash cho nút> = 7.0.0 :Object.values(require('os').networkInterfaces()).reduce((r, list) => r.concat(list.reduce((rr, i) => rr.concat(i.family==='IPv4' && !i.internal && i.address || []), [])), [])
som

224

Hiện tại os.networkInterfaces không hoạt động trên windows. Chạy các chương trình để phân tích kết quả có vẻ hơi iffy. Đây là những gì tôi sử dụng.

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

Điều này sẽ trả về ip cục bộ giao diện mạng đầu tiên của bạn.


4
@HermannIngjaldsson: Đây không phải là một chỉ trích thông tin rất kỹ lưỡng. Bạn có thể đặc sắc hơn không? Có thể lấy mã ví dụ và đặt nó vào một câu hỏi mới cung cấp thêm chi tiết và hỏi tại sao nó không hoạt động?
Xedecimal

8
Không phải lúc nào cũng nên sử dụng tra cứu DNS, vì nó có thể trả về thông tin sai (tức là dữ liệu được lưu trong bộ nhớ cache). Theo tôi, sử dụng 'os.networkInterfaces' là một ý tưởng tốt hơn.
Guido

1
Sử dụng DNS hoạt động nếu máy chủ của bạn có mục dns ở đâu đó. Tuy nhiên, trong rất nhiều ứng dụng không có mục dns (ví dụ: máy tính xách tay của tôi). os.networkInterfaces () có lẽ là cách để đi.
Jeff Whites

1
Lưu ý rằng điều này sử dụng tra cứu hệ điều hành, không nhất thiết phải tra cứu DNS và nên biết địa chỉ IP chính của chính nó ...
w00t

Điều gì xảy ra nếu tôi nhận được địa chỉ DNS của mỗi giao diện
taha027

203

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

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

@Uri đây là những gì các câu hỏi yêu cầu
Seb

1
tài liệu cho gói này không rõ ràng ... tôi cũng có thể lấy địa chỉ quảng bá hay tôi phải tự cung cấp?
Michael

12
@majidarif Tôi không nhận ra đó là một lý do hợp lệ cho tài liệu kém
Michael

7
Điều này hoạt động rất tốt. Lấy địa chỉ IP theo nghĩa đen là một lớp lót. Thông minh.
EvSunWoodard

5
Nó không cung cấp cho bạn địa chỉ IP của tất cả các bộ điều hợp. Nếu bạn đã cài đặt Docker, nó sẽ cung cấp địa chỉ docker vEthernet thay vì địa chỉ Ethernet thực tế của bạn
TetraDev

62

Bất kỳ IP nào của máy bạn có thể tìm thấy bằng cách sử dụng mô-đun os - và đó là nguồn gốc của NodeJS

var os = require( 'os' );

var networkInterfaces = os.networkInterfaces( );

console.log( networkInterfaces );

Tất cả những gì bạn cần làm là gọi os.networkInterfaces () và bạn sẽ nhận được một danh sách dễ quản lý - dễ dàng hơn so với việc chạy ifconfig bởi các giải đấu

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

Tốt

Edoardo


9
Câu trả lời tuyệt vời. var ip = networkInterfaces ['eth0'] [0] ['address']
Natus đã vẽ

trong khi điều này có vẻ tuyệt vời bởi vì nó đơn giản, hiệu quả thực tế của nó có thể phụ thuộc vào cấu hình mạng của bạn. Ví dụ: không có eth0 trên cấu hình mặc định của OS X, đó là en0.
ccnokes

3
Làm việc cho tôi. var address = networkInterfaces['venet0:0'][0].address
Anthony

kỳ dị. trên SunOS 5.11, cuộc gọi này trả về một đối tượng trống
Michael

34

Đây là một đoạn mã node.js sẽ phân tích cú pháp đầu ra ifconfigvà (không đồng bộ) trả về địa chỉ IP đầu tiên được tìm thấy:

(chỉ được thử nghiệm trên MacOS Snow Leopard; hy vọng nó cũng hoạt động trên 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);
        });
    };
})();

Ví dụ sử dụng:

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

Nếu tham số thứ hai là true, hàm sẽ thực hiện cuộc gọi hệ thống mỗi lần; mặt khác, giá trị lưu trữ được sử dụng.


Phiên bản cập nhật

Trả về một mảng của tất cả các địa chỉ mạng cục bộ.

Đã thử nghiệm trên Ubuntu 11.04 và 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);
        });
    };
})();

Ví dụ sử dụng cho phiên bản cập nhật

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

Đã thử nghiệm ngay bây giờ trên OSX Lion, hoàn hảo. Cám ơn rất nhiều!
T3db0t

Tôi đã phải xóa dấu gạch nối sau từ "IP" trong regrec Windows của bạn, vì đầu ra của tôi không có dấu gạch nối (Tôi đang sử dụng Windows XP 32-bit). Tôi không biết đó là lỗi đánh máy hay nếu phiên bản Windows của bạn thực sự xuất ra dấu gạch nối sau "IP", nhưng để đảm bảo an toàn, tôi cho rằng nó có thể được tùy chọn : filterRE = /\bIP-?[^:\r\n]+:\s*([^\s]+)/g;. Bên cạnh đó, kịch bản tuyệt vời, một cứu cánh thực sự. Cảm ơn nhiều!
Người dùng không tìm thấy

@jSepia: Đó có lẽ là một thứ nội địa hóa. Windows Đức in "IP-Adresse";)
user123444555621

Đủ công bằng, nhưng bây giờ bạn đã phá vỡ nó một lần nữa: p Đầu ra ipconfig của tôi không bao gồm "v4" hay "v6", đó dường như là một thứ Vista / 7 (xem technet.microsoft.com/en-us/l Library / bb726952 .aspx )
Không tìm thấy người dùng

Không có lý do cho một hack như vậy. Bây giờ chúng ta có os.networkInterfaces ().
Brad

32

Đây là phương pháp tiện ích của tôi để lấy địa chỉ IP cục bộ, giả sử bạn đang tìm địa chỉ IPv4 và máy chỉ có một giao diện mạng thực. Nó có thể dễ dàng được tái cấu trúc để trả về một mảng IP cho các máy đa giao diện.

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

Phiên bản cà phê:getLocalIP = (interfaceName = "en0",version = "IPv4")-> iface = require('os').networkInterfaces()[interfaceName] for alias in iface if (alias.family == version && !alias.internal) return alias.address return "0.0.0.0"
Jay

30

Cài đặt một mô-đun gọi là ip như

npm install ip

sau đó sử dụng mã này

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

5
Điều này trả về 127.0.0.1
WeSam Abdallah

nó trả về địa chỉ IP riêng không phải là địa chỉ công cộng.
Mehmet Kurtipek

23

Gọi ifconfig phụ thuộc rất nhiều vào nền tảng và lớp mạng không biết địa chỉ IP nào là ổ cắm, vì vậy tốt nhất là hỏi nó. Node không tiết lộ một phương pháp trực tiếp để làm điều này, nhưng bạn có thể mở bất kỳ ổ cắm nào và hỏi địa chỉ IP cục bộ nào đang được sử dụng. Ví dụ: mở một ổ cắm cho www.google.com:

var net = require('net');
function getNetworkIP(callback) {
  var socket = net.createConnection(80, 'www.google.com');
  socket.on('connect', function() {
    callback(undefined, socket.address().address);
    socket.end();
  });
  socket.on('error', function(e) {
    callback(e, 'error');
  });
}

Trường hợp sử dụng:

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

Trong trường hợp bạn đang tự hỏi - điều này không nhất thiết phải có địa chỉ IP công cộng mà thế giới nhìn thấy.
artur

Sẽ là một giải pháp tốt nếu nó không phụ thuộc vào kết nối internet và tốc độ của nó ..
Jacob Rask

Trong trường hợp của tôi, giải pháp này là hoàn hảo, vì tôi cần biết IP của giao diện, một yêu cầu cụ thể được đưa ra.
radicand

20

IP cục bộ của bạn luôn là 127.0.0.1.

Sau đó, có IP mạng, mà bạn có thể nhận được từ ifconfig(* nix) hoặc ipconfig(win). Điều này chỉ hữu ích trong mạng cục bộ.

Sau đó, có IP bên ngoài / công cộng của bạn, mà bạn chỉ có thể nhận được nếu bạn có thể yêu cầu bộ định tuyến bằng cách nào đó hoặc bạn có thể thiết lập một dịch vụ bên ngoài trả về địa chỉ IP của khách hàng bất cứ khi nào nhận được yêu cầu. Ngoài ra còn có các dịch vụ khác như vậy tồn tại, như whatismyip.com.

Trong một số trường hợp (ví dụ: nếu bạn có kết nối WAN), IP mạng và IP công cộng là như nhau và cả hai có thể được sử dụng bên ngoài để truy cập vào máy tính của bạn.

Nếu mạng và IP công cộng của bạn khác nhau, bạn có thể cần phải có bộ định tuyến mạng chuyển tiếp tất cả các kết nối đến ip mạng của bạn.


Cập nhật 2013:

Bây giờ có một cách mới để làm điều này, bạn có thể kiểm tra đối tượng socket của kết nối của mình để tìm một thuộc tính được gọi localAddress, vd net.socket.localAddress. Nó trả về địa chỉ ở cuối ổ cắm của bạn.

Cách dễ nhất là chỉ cần mở một cổng ngẫu nhiên và lắng nghe trên đó, sau đó lấy địa chỉ của bạn và đóng ổ cắm.


Cập nhật 2015:

Cái trước không hoạt động nữa.


Điều đó có nghĩa là để có được địa chỉ mạng trong nodejs, bạn cần thực hiện một cuộc gọi hệ thống đến ifconfighoặc ipconfigphân tích chuỗi phản hồi?
user123444555621

@ Pumbaa80 - Khá nhiều, trừ khi card mạng của bạn có một số trình điều khiển bạn có thể gọi. Ngoài ra nếu bạn có nhiều card mạng (hoặc adapter, giống như hamachi), không có cách nào bạn có thể chỉ cần gọi một chức năng của các loại và nhận được một IP mà là THE IP. Vì vậy, phân tích cú pháp và giải thích đầu ra của ifconfigkhá nhiều cách duy nhất.
Tor Valamo

Có vẻ như net.socketlợi nhuận undefinedcủa năm 2015, vì vậy "cách làm mới này" không còn hiệu quả nữa. Có một net.Socket, nhưng nó không có localAddresstài sản.
phân tích

14

sử dụng mô-đun ip npm

var ip = require('ip');

console.log(ip.address());

> '192.168.0.117'

1
Tôi không biết, làm thế nào để nói với người dùng hạ cánh trên trang này bây giờ rằng đây là lựa chọn phù hợp duy nhất trong bối cảnh hiện tại.
Gagan

Cảm ơn @Gagan sự đánh giá cao của bạn.
KARTHIKEYAN.A

13

Một lớp lót chính xác cho cả gạch dướilodash là:

var ip = require('underscore')
    .chain(require('os').networkInterfaces())
    .values()
    .flatten()
    .find({family: 'IPv4', internal: false})
    .value()
    .address;

3
Bạn có thể sử dụng: .find({family: 'IPv4', internal: false})cũng như cho một mã thanh lịch ngắn hơn
dcohenb

9

Đây là những gì có thể là câu trả lời sạch nhất, đơn giản nhất mà không phụ thuộc & hoạt động trên tất cả các nền tảng.

const { lookup } = require('dns').promises;
const { hostname } = require('os');

async function getMyIPAddress(options) {
  return (await lookup(hostname(), options))
    .address;
}

8

Tất cả những gì tôi biết là tôi muốn địa chỉ IP bắt đầu bằng 192.168.. Mã này sẽ cung cấp cho bạn rằng:

function getLocalIp() {
    const os = require('os');

    for(let addresses of Object.values(os.networkInterfaces())) {
        for(let add of addresses) {
            if(add.address.startsWith('192.168.')) {
                return add.address;
            }
        }
    }
}

Tất nhiên bạn chỉ có thể thay đổi số nếu bạn đang tìm kiếm một số khác.


Nếu địa chỉ không bắt đầu 192.168thì sao?
anu

@anu Hoặc thay đổi tiền tố thành tiền tố bạn đang tìm kiếm hoặc sử dụng một trong nhiều giải pháp khác mà mọi người đã đăng ở đây :-) IP cục bộ của tôi luôn bắt đầu với 192.168.đó là lý do tôi chọn nó.
mở

6

để sử dụng Linux và MacOS, nếu bạn muốn nhận IP của mình theo cách đồng bộ, hãy thử cách này.

var ips = require('child_process').execSync("ifconfig | grep inet | grep -v inet6 | awk '{gsub(/addr:/,\"\");print $2}'").toString().trim().split("\n");
console.log(ips);

kết quả sẽ là một cái gì đó như thế này.

[ '192.168.3.2', '192.168.2.1' ]

6

Tôi đã viết một mô-đun Node.js xác định địa chỉ IP cục bộ của bạn bằng cách xem giao diện mạng nào chứa cổng mặc định của bạn.

Điều này đáng tin cậy hơn là chọn một giao diện từ os.networkInterfaces()hoặc tra cứu DNS của tên máy chủ. Nó có thể bỏ qua các giao diện ảo, loopback và giao diện VPN của VMware và nó hoạt động trên Windows, Linux, Mac OS và FreeBSD. Dưới mui xe, nó thực thi route.exehoặc netstatphân tích đầu ra.

var localIpV4Address = require("local-ipv4-address");

localIpV4Address().then(function(ipAddress){
    console.log("My IP address is " + ipAddress);
    // My IP address is 10.4.4.137 
});

xấu hổ vì nó không hoạt động trên windows khi ngôn ngữ không được đặt thành tiếng Anh :(
Javier G.

1
Cảm ơn bạn đã báo cáo lỗi này, @JavierG! Tôi đã xuất bản phiên bản 0.0.2 nên sửa nó.
Ben Hutchison

5

Đây là một phiên bản đơn giản hóa trong javilla javascript để có được một ip duy nhất:

function getServerIp() {

  var os = require('os');
  var ifaces = os.networkInterfaces();
  var values = Object.keys(ifaces).map(function(name) {
    return ifaces[name];
  });
  values = [].concat.apply([], values).filter(function(val){ 
    return val.family == 'IPv4' && val.internal == false; 
  });

  return values.length ? values[0].address : '0.0.0.0';
}

4

Đối với bất kỳ ai quan tâm đến tính ngắn gọn, đây là một số "lớp lót" không yêu cầu bổ trợ / phụ thuộc không phải là một phần của cài đặt Node tiêu chuẩn:

IPv4 và IPv6 công khai của eth0 dưới dạng Mảng:

var ips = require('os').networkInterfaces().eth0.map(function(interface) { 
    return interface.address;
});

IP công khai đầu tiên của eth0 (thường là IPv4) dưới dạng Chuỗi:

var ip = require('os').networkInterfaces().eth0[0].address;

Hãy nhớ rằng những lớp lót này là nền tảng cụ thể. Trên OS X, tôi có en0en1cho ethernet và wifi. Trên Windows, tôi có Local Area ConnectionWireless Network Connection.
xverges

Nếu bạn muốn biết về IP từ xa công cộng của mình (Trên OS X), hãy sử dụng: var ip = quiries ('os'). NetworkInterfaces (). En0 [1] .address;
Marcelo dos Santos

3

Google hướng tôi đến câu hỏi này trong khi tìm kiếm "node.js get ip server" , vì vậy hãy đưa ra câu trả lời thay thế cho những ai đang cố gắng đạt được điều này trong chương trình máy chủ node.js của họ (có thể là trường hợp của poster gốc).

Trong trường hợp tầm thường nhất khi máy chủ bị ràng buộc chỉ có một địa chỉ IP, sẽ không cần xác định địa chỉ IP vì chúng ta đã biết địa chỉ nào chúng ta ràng buộc nó (ví dụ: tham số thứ hai được truyền cho listen()hàm).

Trong trường hợp ít tầm thường hơn khi máy chủ bị ràng buộc với nhiều địa chỉ IP, chúng tôi có thể cần xác định địa chỉ IP của giao diện mà máy khách được kết nối. Và như Tor Valamo đề xuất ngắn gọn, ngày nay, chúng ta có thể dễ dàng lấy thông tin này từ ổ cắm được kết nối và localAddresstài sản của nó .

Ví dụ: nếu chương trình là máy chủ web:

var http = require("http")

http.createServer(function (req, res) {
    console.log(req.socket.localAddress)
    res.end(req.socket.localAddress)
}).listen(8000)

Và nếu đó là một máy chủ TCP chung:

var net = require("net")

net.createServer(function (socket) {
    console.log(socket.localAddress)
    socket.end(socket.localAddress)
}).listen(8000)

Khi chạy một chương trình máy chủ, giải pháp này cung cấp tính di động, độ chính xác và hiệu quả rất cao.

Để biết thêm chi tiết, xem:


3

Dựa trên một nhận xét ở trên, đây là những gì hoạt động cho phiên bản hiện tại của Node:

var os = require('os');
var _ = require('lodash');

var ip = _.chain(os.networkInterfaces())
  .values()
  .flatten()
  .filter(function(val) {
    return (val.family == 'IPv4' && val.internal == false)
  })
  .pluck('address')
  .first()
  .value();

Nhận xét về một trong những câu trả lời ở trên đã bỏ lỡ cuộc gọi đến values(). Có vẻ như os.networkInterfaces()bây giờ trả về một đối tượng thay vì một mảng.


1
Tôi <3 lodash. Đặc biệt là golf lodash! Cái _.chain(..)có thể được viết lại thành _(...), cái .filter(..)có thể được viết lại dưới dạng .where({family: 'IPv4', internal: false}), và bạn có thể bỏ bản cuối cùng value().first()nó giúp bạn khi xâu chuỗi.
Ryan Graham

3

Dưới đây là một biến thể của các ví dụ trên. Cần phải lọc các giao diện vMware, v.v. Nếu bạn không vượt qua một chỉ mục, nó sẽ trả về tất cả các địa chỉ nếu không bạn có thể muốn đặt mặc định thành 0 thì chỉ cần chuyển null để lấy tất cả, nhưng bạn sẽ loại nó ra. Bạn cũng có thể chuyển vào một đối số khác cho bộ lọc regex nếu có xu hướng thêm

    function getAddress(idx) {

    var addresses = [],
        interfaces = os.networkInterfaces(),
        name, ifaces, iface;

    for (name in interfaces) {
        if(interfaces.hasOwnProperty(name)){
            ifaces = interfaces[name];
            if(!/(loopback|vmware|internal)/gi.test(name)){
                for (var i = 0; i < ifaces.length; i++) {
                    iface = ifaces[i];
                    if (iface.family === 'IPv4' &&  !iface.internal && iface.address !== '127.0.0.1') {
                        addresses.push(iface.address);
                    }
                }
            }
        }
    }

    // if an index is passed only return it.
    if(idx >= 0)
        return addresses[idx];
    return addresses;
}

3

Tôi đã có thể làm điều này bằng cách chỉ sử dụng nút js

Như nút Node

var os = require( 'os' );
var networkInterfaces = Object.values(os.networkInterfaces())
    .reduce((r,a)=>{
        r = r.concat(a)
        return r;
    }, [])
    .filter(({family, address}) => {
        return family.toLowerCase().indexOf('v4') >= 0 &&
            address !== '127.0.0.1'
    })
    .map(({address}) => address);
var ipAddresses = networkInterfaces.join(', ')
console.log(ipAddresses);

Là tập lệnh bash (cần cài đặt nút js)

function ifconfig2 ()
{
    node -e """
        var os = require( 'os' );
        var networkInterfaces = Object.values(os.networkInterfaces())
            .reduce((r,a)=>{
                r = r.concat(a)
                return r;
            }, [])
            .filter(({family, address}) => {
                return family.toLowerCase().indexOf('v4') >= 0 &&
                    address !== '127.0.0.1'
            })
            .map(({address}) => address);
        var ipAddresses = networkInterfaces.join(', ')
        console.log(ipAddresses);
    """
}

2

Đây là biến thể của tôi cho phép nhận cả địa chỉ IPv4 và IPv6 theo cách di động:

/**
 * Collects information about the local IPv4/IPv6 addresses of
 * every network interface on the local computer.
 * Returns an object with the network interface name as the first-level key and
 * "IPv4" or "IPv6" as the second-level key.
 * For example you can use getLocalIPs().eth0.IPv6 to get the IPv6 address
 * (as string) of eth0
 */
getLocalIPs = function () {
    var addrInfo, ifaceDetails, _len;
    var localIPInfo = {};
    //Get the network interfaces
    var networkInterfaces = require('os').networkInterfaces();
    //Iterate over the network interfaces
    for (var ifaceName in networkInterfaces) {
        ifaceDetails = networkInterfaces[ifaceName];
        //Iterate over all interface details
        for (var _i = 0, _len = ifaceDetails.length; _i < _len; _i++) {
            addrInfo = ifaceDetails[_i];
            if (addrInfo.family === 'IPv4') {
                //Extract the IPv4 address
                if (!localIPInfo[ifaceName]) {
                    localIPInfo[ifaceName] = {};
                }
                localIPInfo[ifaceName].IPv4 = addrInfo.address;
            } else if (addrInfo.family === 'IPv6') {
                //Extract the IPv6 address
                if (!localIPInfo[ifaceName]) {
                    localIPInfo[ifaceName] = {};
                }
                localIPInfo[ifaceName].IPv6 = addrInfo.address;
            }
        }
    }
    return localIPInfo;
};

Đây là phiên bản CoffeeScript có cùng chức năng:

getLocalIPs = () =>
    ###
    Collects information about the local IPv4/IPv6 addresses of
      every network interface on the local computer.
    Returns an object with the network interface name as the first-level key and
      "IPv4" or "IPv6" as the second-level key.
    For example you can use getLocalIPs().eth0.IPv6 to get the IPv6 address
      (as string) of eth0
    ###
    networkInterfaces = require('os').networkInterfaces();
    localIPInfo = {}
    for ifaceName, ifaceDetails of networkInterfaces
        for addrInfo in ifaceDetails
            if addrInfo.family=='IPv4'
                if !localIPInfo[ifaceName]
                    localIPInfo[ifaceName] = {}
                localIPInfo[ifaceName].IPv4 = addrInfo.address
            else if addrInfo.family=='IPv6'
                if !localIPInfo[ifaceName]
                    localIPInfo[ifaceName] = {}
                localIPInfo[ifaceName].IPv6 = addrInfo.address
    return localIPInfo

Ví dụ đầu ra cho console.log(getLocalIPs())

{ lo: { IPv4: '127.0.0.1', IPv6: '::1' },
  wlan0: { IPv4: '192.168.178.21', IPv6: 'fe80::aa1a:2eee:feba:1c39' },
  tap0: { IPv4: '10.1.1.7', IPv6: 'fe80::ddf1:a9a1:1242:bc9b' } }

2

Nếu bạn tham gia vào toàn bộ điều ngắn gọn, thì đây là cách sử dụng lodash :

var os = require('os');
var _ = require('lodash');
var firstLocalIp = _(os.networkInterfaces()).values().flatten().where({ family: 'IPv4', internal: false }).pluck('address').first();

console.log('First local IPv4 address is ' + firstLocalIp);


2

Tương tự như các câu trả lời khác nhưng ngắn gọn hơn:

'use strict';

const interfaces = require('os').networkInterfaces();

const addresses = Object.keys(interfaces)
  .reduce((results, name) => results.concat(interfaces[name]), [])
  .filter((iface) => iface.family === 'IPv4' && !iface.internal)
  .map((iface) => iface.address);

1
chỉ muốn đề cập rằng bạn có thể thay thế Object.keys(interfaces).reduce(...)với Object.values(interfaces).flat()và nó sẽ là điều tương tự.
kimbaudi

2

Một lớp lót cho MAC os địa chỉ localhost đầu tiên.

Khi phát triển ứng dụng trên mac os và muốn thử nghiệm nó trên điện thoại và cần ứng dụng của bạn tự động chọn ip localhost.

require('os').networkInterfaces().en0.find(elm=>elm.family=='IPv4').address

Đây chỉ là đề cập đến cách bạn có thể tự động tìm ra địa chỉ IP. Để kiểm tra điều này, bạn có thể đi đến thiết bị đầu cuối nhấn

node
os.networkInterfaces().en0.find(elm=>elm.family=='IPv4').address

đầu ra sẽ là địa chỉ ip localhost của bạn.


2

Đây là một lớp lót nhỏ gọn cho bạn thực hiện chức năng này:

const ni = require('os').networkInterfaces();
Object
  .keys(ni)
  .map(interf =>
    ni[interf].map(o => !o.internal && o.family === 'IPv4' && o.address))
  .reduce((a, b) => a.concat(b))
  .filter(o => o)
  [0];

để làm cho mã của bạn ngắn gọn hơn, bạn có thể loại bỏ cuộc gọi đến reducevà thay thế cuộc gọi mapbằng cuộc gọi đến flatMap.
kimbaudi

2

Nhiều lần tôi thấy có rất nhiều giao diện phải đối mặt với nội bộ và bên ngoài có sẵn (ví dụ: 10.0.75.1, 172.100.0.1, 192.168.2.3), và đó là một bên ngoài mà tôi thật sự sau ( 172.100.0.1).

Trong trường hợp bất kỳ ai khác có mối quan tâm tương tự, đây là một lần nữa đảm nhận điều này với hy vọng có thể giúp ích được ...

const address = Object.keys(os.networkInterfaces())
    // flatten interfaces to an array
    .reduce((a, key) => [
        ...a,
        ...os.networkInterfaces()[key]
    ], [])
    // non-internal ipv4 addresses only
    .filter(iface => iface.family === 'IPv4' && !iface.internal)
    // project ipv4 address as a 32-bit number (n)
    .map(iface => ({...iface, n: (d => ((((((+d[0])*256)+(+d[1]))*256)+(+d[2]))*256)+(+d[3]))(iface.address.split('.'))}))
    // set a hi-bit on (n) for reserved addresses so they will sort to the bottom
    .map(iface => iface.address.startsWith('10.') || iface.address.startsWith('192.') ? {...iface, n: Math.pow(2,32) + iface.n} : iface)
    // sort ascending on (n)
    .sort((a, b) => a.n - b.n)
    [0]||{}.address;

1

Tôi đang sử dụng node.js 0.6.5

$ node -v
v0.6.5

Đây là những gì tôi làm

var util = require('util');
var exec = require('child_process').exec;
function puts(error, stdout, stderr) {
        util.puts(stdout);
}
exec("hostname -i", puts);

Điều này làm việc với hostname -I(chữ hoa i). Nó trả về một danh sách tất cả các địa chỉ IP được gán của máy. Địa chỉ IP đầu tiên là những gì bạn cần. IP đó là cái được gắn vào giao diện hiện tại.
blueren

1

Đây là phiên bản nhiều ip của câu trả lời của jhurliman ở trên:

function getIPAddresses() {

    var ipAddresses = [];

    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) {
                ipAddresses.push(alias.address);
            }
        }
    }

    return ipAddresses;
}

1

Tôi nhận ra đây là một chủ đề cũ, nhưng tôi muốn đưa ra một cải tiến về câu trả lời hàng đầu vì những lý do sau:

  • Mã nên tự giải thích càng tốt.
  • Việc liệt kê qua một mảng sử dụng cho ... trong ... nên tránh.
  • cho ... trong ... liệt kê nên được xác nhận để đảm bảo đối tượng được liệt kê có chứa tài sản mà bạn đang tìm kiếm. Vì javsacript được gõ lỏng lẻo và for ... in ... có thể được trao bất kỳ đối tượng trọng tài nào để xử lý; an toàn hơn để xác nhận tài sản mà chúng tôi đang tìm kiếm có sẵn.

    var os = require('os'),
        interfaces = os.networkInterfaces(),
        address,
        addresses = [],
        i,
        l,
        interfaceId,
        interfaceArray;
    
    for (interfaceId in interfaces) {
        if (interfaces.hasOwnProperty(interfaceId)) {
            interfaceArray = interfaces[interfaceId];
            l = interfaceArray.length;
    
            for (i = 0; i < l; i += 1) {
    
                address = interfaceArray[i];
    
                if (address.family === 'IPv4' && !address.internal) {
                    addresses.push(address.address);
                }
            }
        }
    }
    
    console.log(addresses);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.