blog.kur.jp

バイオリンと山、自転車をこよなく愛するkurのチラシの裏。たまには技術的なことを書いたりするかも知れません。

起動直後に自身のIPを外部に投げつける

BeagleBone BlackだとかRaspberry Piだとか、画面の無いLinux機器を外部から操作しようと思う場合、SSH接続してコマンドを叩く、ってのが一般的かなと思うのですが、SSH接続をしようにもその機器のIPアドレスを知らない事にはどうにもならないわけです。

ボンジュールなどのmDNSでも良いんですが、端末によっては上手く動かない事等もあったため不便を強いられて居ました。と言うことで、起動直後に自身に割り当てられたIPを取得して外部に立てたサーバに投げつけるスクリプトを書きましたので備忘録です。

まず、下記のようなnode.jsスクリプトを作成します。

var os = require('os');
var http = require('http');
console.log(getLocalAddress());
var req = http.get("http://サーバのアドレス/device/端末名/ip/" + getLocalAddress());
function getLocalAddress() {
    var ifacesObj = {}
    var interfaces = os.networkInterfaces();
    if(interfaces.hasOwnProperty("wlan0")){
        interfaces["wlan0"].forEach(function(details){
            if(details.family == "IPv4"){
                ifacesObj = details.address;
            }
        })
    }
    return ifacesObj;
};

ここで作成したnode.jsスクリプトには実行権限を与えるのを忘れないようにして下さい。

/etc/rc.localに下記の一行を追記します。

nodejs 上記で作成したファイルへのパス

以上です。ちなみにサーバ側のコードはどんなんでも良いんですが、こんな感じで動くかと思います。

var http = require('http');
var port = process.env.PORT || 1337;
var ip = "0.0.0.0";
http.createServer(function(req, res) {
  res.writeHead(200, { 'Content-Type': 'text/plain' });
	if(req.url.match(/ip/)){
		ip = req.url;
		res.end('IP: ' + ip);	
	}else{
		res.end('IP: ' + ip);
	}
}).listen(port);

BeagleBone BlackとRaspberry Piで動作確認をしていますが、おそらく他のものでもそのまま、もしくは大きな修正はなく動くんじゃないかと思います。

最後に少しだけ宣伝
本記事でも使用しているRaspberry Piの購入にはRSコンポーネンツさんが大変便利です。配達先が日本国内であればほぼほぼ翌日には届きます。
jp.rs-online.com