読者です 読者をやめる 読者になる 読者になる

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で動作確認をしていますが、おそらく他のものでもそのまま、もしくは大きな修正はなく動くんじゃないかと思います。