У меня есть простая программа node.js, запущенная на моей машине, и я хочу получить локальный IP-адрес ПК, на котором работает моя программа. Как мне получить его с помощью node.js?
Получить локальный IP-адрес в node.js
Ответ 1
'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
Ответ 2
os.networkИнтерфейсы по состоянию на данный момент не работают в Windows. Запуск программ для синтаксического анализа результатов кажется немного неправильным. Вот что я использую.
require('dns').lookup(require('os').hostname(), function (err, add, fam) {
console.log('addr: '+add);
})
Это должно вернуть ваш первый сетевой интерфейс локального ip.
Ответ 3
https://github.com/indutny/node-ip
var ip = require("ip");
console.dir ( ip.address() );
Ответ 4
Любой IP-адрес вашего компьютера, который вы можете найти с помощью модуля os, и native для NodeJS
var os = require( 'os' );
var networkInterfaces = os.networkInterfaces( );
console.log( networkInterfaces );
Все, что вам нужно сделать, это вызвать os.networkInterfaces(), и вы получите легко управляемый список - проще, чем запуск ifconfig лигами
http://nodejs.org/api/os.html#os_os_networkinterfaces
Лучшие
Эдоардо
Ответ 5
Вот фрагмент кода node.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, '$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);
Ответ 6
Установите модуль с именем ip как
npm install ip
то используйте этот код.
var ip = require("ip");
console.log( ip.address() );
Ответ 7
Вот мой метод утилиты для получения локального IP-адреса, предполагая, что вы ищете IPv4-адрес, и машина имеет только один реальный сетевой интерфейс. Он может быть легко реорганизован для возврата массива 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';
}
Ответ 8
Вызов ifconfig очень зависит от платформы, и сетевой уровень знает, что IP-адрес сокета включен, поэтому лучше всего спросить его. Node не предоставляет прямой способ сделать это, но вы можете открыть любой сокет и спросить, какой локальный 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);
}
});
Ответ 9
Ваш локальный IP-адрес всегда 127.0.0.1.
Тогда есть сетевой IP-адрес, который вы можете получить от ifconfig
(* nix) или ipconfig
(win). Это полезно только в локальной сети.
Затем есть ваш внешний/общедоступный IP-адрес, который вы можете получить, только если вы можете как-то спросить маршрутизатор, или вы можете настроить внешнюю службу, которая возвращает IP-адрес клиента всякий раз, когда он получает запрос. Существуют и другие подобные услуги, такие как whatismyip.com.
В некоторых случаях (например, если у вас есть подключение к глобальной сети), IP-адрес сети и общедоступный IP-адрес являются одинаковыми, и оба они могут использоваться снаружи для доступа к вашему компьютеру.
Если ваш сетевой и общедоступный IP-адреса различны, вам может потребоваться, чтобы ваш сетевой маршрутизатор перенаправлял все входящие соединения на ваш IP-адрес сети.
Обновление 2013:
Теперь есть новый способ сделать это, вы можете проверить объект сокета вашего соединения для свойства с именем localAddress
, например. net.socket.localAddress
. Он возвращает адрес на вашем конце сокета.
Самый простой способ - просто открыть случайный порт и прослушать его, затем получить свой адрес и закрыть сокет.
Обновление 2015:
Предыдущее не работает больше.
Ответ 10
Правильный один вкладыш для подчеркивания и lodash:
var ip = require('underscore')
.chain(require('os').networkInterfaces())
.values()
.flatten()
.find({family: 'IPv4', internal: false})
.value()
.address;
Ответ 11
использовать модуль npm ip
var ip = require('ip');
console.log(ip.address());
> '192.168.0.117'
Ответ 12
Все, что я знаю, я хотел, чтобы 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;
}
}
}
}
Конечно, вы можете просто изменить цифры, если вы ищете другой.
Ответ 13
Я написал модуль Node.js, который определяет ваш локальный IP-адрес, посмотрев, какой сетевой интерфейс содержит ваш шлюз по умолчанию.
Это более надежно, чем выбор интерфейса из os.networkInterfaces()
или DNS-поиска имени хоста. Он может игнорировать виртуальные интерфейсы VMware, петлевые и 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
});
Ответ 14
Вот упрощенная версия в javascript vanilla для получения одного 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';
}
Ответ 15
Для всех, кто заинтересован в краткости, вот некоторые "однострочные", которые не требуют плагинов/зависимостей, которые не являются частью стандартной установки Node:
Открытый 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;
Ответ 16
для Linux и MacOS, если вы хотите получить свои IP-адреса синхронным способом, попробуйте это.
var ips = require('child_process').execSync("ifconfig | grep inet | grep -v inet6 | awk '{gsub(/addr:/,\"\");print $2}'").toString().trim().split("\n");
console.log(ips);
результат будет примерно таким.
[ '192.168.3.2', '192.168.2.1' ]
Ответ 17
Google направил меня на этот вопрос во время поиска "node.js get server ip", поэтому дайте альтернативный ответ тем, кто пытается достичь этого на своем сервере node.js (может быть, в случае с оригинальным плакатом).
В самом тривиальном случае, когда сервер привязан к одному IP-адресу, нет необходимости определять IP-адрес, поскольку мы уже знаем, к какому адресу мы его связали (например, второй параметр, переданный в listen()
функция).
В менее тривиальном случае, когда сервер привязан к нескольким IP-адресам, нам может понадобиться определить IP-адрес интерфейса, к которому подключен клиент. И как кратко предложил Tor Valamo, в настоящее время мы можем легко получить эту информацию из подключенного сокета и его свойства localAddress
.
Например, если программа является веб-сервером:
var http = require("http")
http.createServer(function (req, res) {
console.log(req.socket.localAddress)
res.end(req.socket.localAddress)
}).listen(8000)
И если это общий TCP-сервер:
var net = require("net")
net.createServer(function (socket) {
console.log(socket.localAddress)
socket.end(socket.localAddress)
}).listen(8000)
При запуске серверной программы это решение обеспечивает очень высокую мобильность, точность и эффективность.
Подробнее см.
Ответ 18
Основываясь на вышеприведенном комментарии, вот что работает для текущей версии 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()
теперь возвращает объект вместо массива.
Ответ 19
Вот вариант приведенных выше примеров. Он берет на себя фильтрацию интерфейсов 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;
}
Ответ 20
Здесь мой вариант, который позволяет переносить адреса 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' } }
Ответ 21
Если вы находитесь во всей краткости, здесь используется 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);
Ответ 22
Как и другие ответы, но более сжатые:
'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);
Ответ 23
Один лайнер для MAC-адреса только для локального хоста.
При разработке приложений на Mac OS, и хотите протестировать его на телефоне, и вам нужно, чтобы ваше приложение автоматически выбирало localhost ip.
require('os').networkInterfaces().en0.find(elm=>elm.family=='IPv4').address
Это просто указать, как вы можете автоматически узнать IP-адрес. Чтобы проверить это, вы можете перейти к нажатию терминала
node
os.networkInterfaces().en0.find(elm=>elm.family=='IPv4').address
вывод будет вашим адресом localhost ip.
Ответ 24
Много раз я обнаружил, что доступно несколько внутренних и внешних интерфейсов (пример: 10.0.75.1
, 172.100.0.1
, 192.168.2.3
), и это внешний, который мне действительно 172.100.0.1
(172.100.0.1
).
В случае, если у кого-то еще есть подобная проблема, вот еще один пример, который, возможно, может помочь...
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;
Ответ 25
Вот что может быть самым чистым и простым ответом без зависимостей, который работает на всех платформах.
const { lookup } = require('dns').promises;
const { hostname } = require('os');
async function getMyIPAddress(options) {
return (await lookup(hostname(), options))
.address;
}
Ответ 26
Я использую node.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);
Ответ 27
Вот версия jhurliman с несколькими ip-версиями:
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;
}
Ответ 28
Я понимаю, что это старый поток, но я хотел бы предложить улучшение в верхнем ответе по следующим причинам:
- Код должен быть максимально понятным.
- Следует избегать перечисления массива с помощью для... в....
-
для... in... перечисление должно быть проверено, чтобы гарантировать, что объект, который перечислил, содержит свойство, которое вы ищете. Поскольку javsacript свободно набирается, а для... в... может быть передан любой предмет арбитража; это безопаснее, чтобы проверить, что свойство, которое мы ищем, доступно.
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);
Ответ 29
надеюсь, что это поможет
var os = require( 'os' );
var networkInterfaces = os.networkInterfaces( );
var arr = networkInterfaces['Local Area Connection 3']
var ip = arr[1].address;
Ответ 30
Здесь аккуратный маленький вкладыш для вас, который делает это функционально:
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];