唐突な思い付きネタですw
nslookupはDNSにドメイン情報を問い合わせるためのコマンドで、IPアドレスからホスト名を取得したり、ホスト名からIPアドレスを取得したりできる仕組みです。
すでに、Web上でnslookupと同等の結果を得られるサービスはたくさんあるのですが、PHPで実装する際の超簡単なサンプルを作成してみました。
基礎知識
PHPで実装する場合、DNSの問い合わせには下記関数を使用できます。
gethostbyaddr — 指定した IP アドレスに対応するインターネットホスト名を取得する
gethostbyname — インターネットホスト名に対応するIPアドレスを取得する
gethostbynamel — 指定したインターネットホスト名に対応するIPアドレスのリストを取得する
今回は、下記2つの関数を使います。
・正引き(ホスト名→IP):gethostbynamel(複数結果がある場合配列)
・逆引き(IP→ホスト名):gethostbyaddr
サンプルコード
<?php $search = $_GET["search"]; $list = array(); // null check if ( empty($search) ) { die("no parameter"); } // IP search mode (XXX.XXX.XXX.XXX) if ( preg_match("/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$/",$search) ) { $list[] = gethostbyaddr($search); if ( $host == $search ) { die("Not found"); } } // Hostname search mode else { if ( !$ips = gethostbynamel($search) ) { die("Not found"); } $list = $ips; } // output var_dump($list); ?>
searchパラメータで調べたいIPかホスト名を渡しますが、パラメータがIPだったら(XXX.XXX.XXX.XXXの形式)gethostbyaddrを、それ以外はgethostbynamelを使って検索するように条件分岐しています。
まとめ
今回のサンプルではアウトプットをvar_dumpで省略していますが、この部分をフォーマットして出せば他に使い回せますね。
次回、このコードを使ったAPI的なものでも作ってみようと思います。
私も思いつきですが、nslookupは、WindowsもUnix系OSも同じコマンドで、引数も似ているので、system関数で直接OSコマンドを実行するのも有りかと思います。
PerlでもJavaでも同じですが。。。
いかがでしょうか。
>よしきみさん
あーなるほど、その方がシンプルなコードですみそうですね。
ただ、OSコマンドにパラメータを渡すのが結構怖いです。エスケープすりゃいいんだけど。
あと、nslookupの結果をただ表示するだけの機能であればOSコマンドでいいんだけど、
返ってきた値(IPかホスト名)を別の処理に渡す事を考えると、複数行のテキストじゃなくて
StringかArrayで値だけとれた方が便利かなと思って関数使ってます。
その辺の用途を想定したAPIを作ってるので、あとで別のエントリーに書きます。