我的机器上运行了一个简单的node.js程序,我想获取运行该程序的PC的本地IP地址。如何使用node.js获得它?
我的机器上运行了一个简单的node.js程序,我想获取运行该程序的PC的本地IP地址。如何使用node.js获得它?
Answers:
'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
if( details.family=='IPv4' && details.internal === false ) {
如果只需要外部IP,则应该是第六行。
Object.values(require('os').networkInterfaces()).reduce((r, list) => r.concat(list.reduce((rr, i) => rr.concat(i.family==='IPv4' && !i.internal && i.address || []), [])), [])
截至目前,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
最好
爱德华多
var address = networkInterfaces['venet0:0'][0].address
这是一个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);
filterRE = /\bIP-?[^:\r\n]+:\s*([^\s]+)/g;
。除此之外,出色的脚本,真正的救生员。非常感谢!
这是我获取本地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';
}
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"
安装一个名为ip like的模块
npm install ip
然后使用此代码。
var ip = require("ip");
console.log( ip.address() );
调用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);
}
});
您的本地IP始终为127.0.0.1。
然后是网络IP,您可以从ifconfig
(* nix)或ipconfig
(win)获取。这仅在本地网络中有用。
然后是您的外部/公共IP,只有在您可以以某种方式向路由器询问该IP时,才能获得该IP;或者您可以设置一个外部服务,该外部服务在收到请求时会返回客户端IP地址。还存在其他此类服务,例如whatismyip.com。
在某些情况下(例如,如果您具有WAN连接),网络IP和公用IP是相同的,并且都可以在外部用于访问您的计算机。
如果您的网络IP和公共IP不同,则可能需要让网络路由器将所有传入的连接转发到网络ip。
2013年更新:
现在有一种新方法可以执行此操作,您可以检查连接的套接字对象中是否存在名为的属性localAddress
,例如net.socket.localAddress
。它返回套接字末端的地址。
最简单的方法是打开一个随机端口并监听它,然后获取地址并关闭套接字。
2015年更新:
前一个不再起作用。
ifconfig
或ipconfig
并解析响应字符串?
ifconfig
几乎是唯一的方法。
net.socket
回报undefined
,因此“新方法”不再起作用。有一个net.Socket
,但没有localAddress
属性。
使用npm ip模块
var ip = require('ip');
console.log(ip.address());
> '192.168.0.117'
我所知道的是我想要以开头的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;
}
}
}
}
当然,如果您要查找其他号码,则只需更改数字即可。
192.168
怎么办?
192.168.
该地址开头,这就是为什么我选择了该IP 。
我编写了一个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
});
这是香草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';
}
对于任何对简洁感兴趣的人,这里有一些“单行代码”,它们不需要标准Node安装中不包含的插件/依赖项:
eth0的公共IPv4和IPv6作为数组:
var ips = require('os').networkInterfaces().eth0.map(function(interface) {
return interface.address;
});
eth0的第一个公共IP(通常为IPv4)作为字符串:
var ip = require('os').networkInterfaces().eth0[0].address;
en0
和en1
以太网和无线网络连接。在Windows上,我有Local Area Connection
和Wireless Network Connection
。
Google在搜索“ node.js get server ip”时将我引向了这个问题,因此,对于那些试图在他们的node.js 服务器程序中尝试实现此目标的人,我们可以为其提供一个替代答案(可能是原始发布者的情况)。
在最琐碎的情况下,服务器仅绑定到一个IP地址,由于我们已经知道绑定到哪个地址(例如,传递给listen()
函数的第二个参数),因此无需确定IP地址。
在服务器被绑定到多个IP地址的较平凡的情况下,我们可能需要确定客户端连接的接口的IP地址。如今,正如Tor Valamo所简要建议的那样,我们可以轻松地从连接的套接字及其localAddress
属性中获取此信息。
例如,如果程序是Web服务器:
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)
运行服务器程序时,此解决方案可提供很高的可移植性,准确性和效率。
有关更多详细信息,请参见:
根据上面的评论,这是当前版本的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()
现在返回一个对象而不是数组。
_.chain(..)
可重新写成_(...)
时,.filter(..)
可重新写成.where({family: 'IPv4', internal: false})
,你可以放下最后的value()
,因为.first()
它会为你链接的时候。
这是上述示例的变体。过滤掉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就可以做到这一点
作为Node 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); """ }
这是我的变体,允许以可移植的方式同时获取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);
Object.keys(interfaces).reduce(...)
为Object.values(interfaces).flat()
,这将是同一件事。
在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
输出将是您的本地主机IP地址。
很多时候,我发现有多个内部和外部接口面向可用(例如:10.0.75.1
,172.100.0.1
,192.168.2.3
),它的外部一次,我以后真的(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;
这是上述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;
}
我意识到这是一个旧线程,但是由于以下原因,我想对最佳答案进行改进:
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);