30 ответов:
'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
ОС.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() );
любой IP-адрес вашей машины вы можете найти с помощью os модуль - и вот уроженца к NodeJS
var os = require( 'os' ); var networkInterfaces = os.networkInterfaces( ); console.log( networkInterfaces );все, что вам нужно сделать, это позвонить ОС.networkInterfaces() и вы получите легко управляемый список-проще, чем работает ifconfig лигами
http://nodejs.org/api/os.html#os_os_networkinterfaces
лучшие
Эдоардо
вот фрагмент узла.JS код, который будет анализировать вывод
ifconfigи (асинхронно) возвращает первый найденный IP-адрес:(тестируется только на 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, '')); } // 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, '') if (!ignoreRE.test(ip)) { cached.push(ip); } } //} callback(error, cached); }); }; })();пример использования для обновленной версии
getNetworkIPs(function (error, ip) { console.log(ip); if (error) { console.log('error:', error); } }, false);
вот мой метод утилиты для получения локального IP-адреса, предполагая, что вы ищете IPv4-адрес, и машина имеет только один реальный сетевой интерфейс. Это может легко быть переработан, чтобы возвратить массив ИПС для multi-интерфейс машины.
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'; }
вызов ifconfig очень зависит от платформы, и сетевой уровень знает, какие ip-адреса есть в сокете, поэтому лучше всего спросить его. Узел не предоставляет прямого метода для этого, но вы можете открыть любой сокет и спросить, какой локальный IP-адрес используется. Например, открытие сокета для 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'); }); }случае использование:
getNetworkIP(function (error, ip) { console.log(ip); if (error) { console.log('error:', error); } });
установите модуль под названием ip like
npm install ipзатем использовать этот код.
var ip = require("ip"); console.log( ip.address() );
ваш локальный IP всегда 127.0.0.1.
тогда есть сетевой IP, который вы можете получить от
ifconfig(*nix) илиipconfig(win). Это полезно только в локальной сети.тогда есть ваш внешний / публичный IP-адрес, который вы можете получить только в том случае, если вы можете каким-то образом попросить маршрутизатор об этом, или вы можете настроить внешнюю службу, которая возвращает IP-адрес клиента всякий раз, когда он получает запрос. Есть и другие такие услуги в существовании, как whatismyip.com.
в некоторых случаях (например, если у вас есть WAN-соединение) сетевой IP и общедоступный IP-адрес одинаковы и могут использоваться внешне для доступа к вашему компьютеру.
если ваша сеть и общедоступные IP-адреса отличаются, Вам может потребоваться, чтобы ваш сетевой маршрутизатор перенаправлял все входящие соединения на ваш сетевой ip-адрес.
обновление 2013 года:
теперь есть новый способ сделать это, вы можете проверить объект сокета вашего соединение для свойства с именемlocalAddress, например,net.socket.localAddress. Он возвращает адрес на вашем конце сокета.
самый простой способ-просто открыть случайный порт и прослушать его, а затем получить свой адрес и закрыть сокет.
обновление 2015:
предыдущий больше не работает.
правильный один лайнер для обоих подчеркивание и лодашь - это:
var ip = require('underscore') .chain(require('os').networkInterfaces()) .values() .flatten() .find({family: 'IPv4', internal: false}) .value() .address;
вот упрощенная версия в ванильном javascript для получения одного ip:
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'; }
для тех, кто заинтересован в краткости, вот некоторые "однострочные", которые не требуют плагинов / зависимостей, которые не являются частью стандартной установки узла:
публичные IPv4 и IPv6 eth0 в виде массива:
var ips = require('os').networkInterfaces().eth0.map(function(interface) { return interface.address; });первый публичный IP eth0 (обычно IPv4) в виде строки:
var ip = require('os').networkInterfaces().eth0[0].address;
для Linux и MacOS использует, если вы хотите получить ваши IP-адреса синхронным способом, попробуйте это.
var ips = require('child_process').execSync("ifconfig | grep inet | grep -v inet6 | awk '{gsub(/addr:/,\"\");print }'").toString().trim().split("\n"); console.log(ips);результат будет примерно таким.
[ '192.168.3.2', '192.168.2.1' ]
Google направил меня на этот вопрос при поиске "узел.js получить ip сервера", поэтому давайте дадим альтернативный ответ для тех, кто пытается достичь этого в своем узле.js сервер
основываясь на комментарии выше, вот что работает для текущей версии 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();комментарий к одному из ответов выше отсутствовал вызов
values(). Это выглядит какos.networkInterfaces()теперь возвращает объект вместо массива.
вот вариация приведенных выше примеров. Он заботится о фильтрации интерфейсов vMware и т. д. Если вы не передаете индекс, он возвращает все адреса, иначе вы можете установить его по умолчанию в 0, а затем просто передать null, чтобы получить все, но вы разберетесь. Вы также можете передать другой arg для фильтра регулярных выражений, если так склонны добавлять
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; }
Я написал узел.модуль на JS это определяет ваш локальный IP-адрес, глядя на то, какой сетевой интерфейс содержит шлюз по умолчанию.
это более надежно, чем выбор интерфейса из
os.networkInterfaces()или DNS-поиск имени хоста. Он может игнорировать виртуальные интерфейсы VMware, loopback и VPN-интерфейсы, и он работает на Windows, Linux, Mac OS и FreeBSD. Под капотом, он выполняетroute.exeилиnetstatи анализирует выход.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 });
все, что я знаю, я хотел, чтобы IP-адрес начинающийся с
192.168.. Этот код даст вам, что: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; } } } }конечно, вы можете просто изменить номера, если вы ищете другой.
Если вы занимаетесь всей краткостью, здесь он использует лодашь:
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);
один лайнер для MAC os только первый адрес localhost.
при разработке приложений на mac os, и хотите, чтобы проверить его на телефоне, и нужно ваше приложение, чтобы выбрать localhost ip автоматически.
require('os').networkInterfaces().en0.find(elm=>elm.family=='IPv4').addressЭто просто упомянуть, как вы можете узнать ip-адрес автоматически. Чтобы проверить это, вы можете перейти к терминалу hit
node os.networkInterfaces().en0.find(elm=>elm.family=='IPv4').addressвыход будет ваш локальный ip-адрес.
Я использую узел.js 0.6.5
$ node -v v0.6.5вот что я делаю
var util = require('util'); var exec = require('child_process').exec; function puts(error, stdout, stderr) { util.puts(stdout); } exec("hostname -i", puts);
вот мульти-ip версия ответа jhurliman выше:
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; }
Я понимаю, что это старый поток, но я хотел бы предложить улучшение верхнего ответа по следующим причинам:
- код должен быть как можно более понятным.
- перечисление по массиву с помощью for...in... следует избегать.
for...in... перечисление должно быть проверено, чтобы убедиться, что перечисляемый объект содержит свойство, которое вы ищете. Как javsacript является строго типизированным и for...in... может быть передан любой арбитражный объект для обработки; безопаснее проверить свойство, которое мы ищем, доступно.
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);
надеюсь, что это помогает
var os = require( 'os' ); var networkInterfaces = os.networkInterfaces( ); var arr = networkInterfaces['Local Area Connection 3'] var ip = arr[1].address;
вот мой вариант, который позволяет получать как IPv4, так и IPv6-адреса в переносном режиме:
/** * 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; };вот версия CoffeeScript той же функции:
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пример вывода для
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' } }
похоже на другие ответы, но более лаконично:
'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);
вот аккуратный маленький однострочный для вас, который делает это функционально:
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];
я смог сделать это, используя только узел js
Как узел JS
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);как скрипт bash (требуется узел 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); """ }
вот вариант, который позволяет получить локальный ip-адрес (протестирован на Mac и Win):
var // Local ip address that we're trying to calculate address // Provides a few basic operating-system related utility functions (built-in) ,os = require('os') // Network interfaces ,ifaces = os.networkInterfaces(); // Iterate over interfaces ... for (var dev in ifaces) { // ... and find the one that matches the criteria var iface = ifaces[dev].filter(function(details) { return details.family === 'IPv4' && details.internal === false; }); if(iface.length > 0) address = iface[0].address; } // Print the result console.log(address); // 10.25.10.147
Comments