自分のマシンで単純なnode.jsプログラムを実行していますが、プログラムが実行されているPCのローカルIPアドレスを取得したいと考えています。node.jsで取得するにはどうすればよいですか?
自分のマシンで単純な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
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
以下は、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);
2番目のパラメータがの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;
。それはさておき、素晴らしいスクリプト、真の命の恩人。どうもありがとう!
IPv4アドレスを探していて、マシンに実際のネットワークインターフェイスが1つしかない場合、ローカル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';
}
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アドレスを知っているため、確認することをお勧めします。ノードはこれを行う直接的な方法を公開していませんが、任意のソケットを開いて、使用されているローカル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です。
次に、ifconfig
(* nix)またはipconfig
(win)から取得できるネットワークIPがあります。これは、ローカルネットワーク内でのみ役立ちます。
次に、外部/パブリックIPがあります。これは、ルーターに何らかの方法で要求できる場合にのみ取得できます。または、要求を取得するたびにクライアントIPアドレスを返す外部サービスを設定できます。whatismyip.comのような他のそのようなサービスも存在します。
場合によっては(たとえば、WAN接続がある場合)、ネットワーク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.
これを選択しました。
私が書いたの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
});
これは、単一のIPを取得するためのバニラJavaScriptの簡易バージョンです。
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(通常はIPv4)の最初のパブリックIP:
var ip = require('os').networkInterfaces().eth0[0].address;
en0
とen1
、イーサネットや無線LANのため。Windowsでは、とがLocal Area Connection
ありWireless Network Connection
ます。
Googleが「node.js get server ip」を検索しているときにこの質問に案内したので、node.js サーバーでこれを達成しようとしている人に別の答えを与えましょうプログラムで(元のポスターの場合もある)。
サーバーが1つだけのIPアドレスにバインドされている最も簡単なケースでは、どのアドレスにバインドしたか(たとえば、2番目のパラメーターが listen()
関数に。
サーバーが複数の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();
上記の回答の1つに対するコメントには、への呼び出しがありませんでしたvalues()
。os.networkInterfaces()
配列ではなくオブジェクトを返すようになりました。
_.chain(..)
ように書き換えることができ_(...)
、.filter(..)
として再記述することができ.where({family: 'IPv4', internal: false})
、あなたは、最終的なドロップすることができますvalue()
のでが.first()
連鎖するときあなたのためにそれを行います。
上記の例のバリエーションを次に示します。vMwareインターフェイスなどをフィルターで除外します。インデックスを渡さない場合はすべてのアドレスが返されます。そうでない場合は、デフォルトに0に設定してから、nullを渡してすべてを取得することもできますが、それを整理します。追加する傾向がある場合は、正規表現フィルターの別の引数を渡すこともできます
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だけを使用してこれを行うことができました
ノード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アドレスになります。
これは機能的にこれを行うあなたのためのきちんとした小さなワンライナーです:
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];
reduce
し、呼び出しを置き換えるmap
の呼び出しでflatMap
。
何度も私は、複数の内部および外部に面するインタフェースが利用可能である見つける(例: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;
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);
hostname -I
(大文字のi)で機能します。マシンに割り当てられているすべてのIPアドレスのリストを返します。最初のIPアドレスが必要です。そのIPは、稼働中の現在のインターフェースに接続されているものです。
上記の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);