数千件のIPアドレスを逆引きしまくるミッション
(2016/01/28追記) 3カ月経ってやっと本当はしたかったことに少し近づきました。
こちらの業界に来て、4勤務日目。 ついに、ちょっと手作業でやってらんない課題が与えられました。
ボス「ちょっと、この表のIPアドレス全部逆引きしてくれる?」
K「喜んで!」
ボス「数千件あるから、うまいことやってちょうだい!」
K「・・・」
という会話があったとか、なかったとかは、どうでもよくて… 十数件ぐらいなら、
dig -x <IPADDRESS>
をやりまくればいいわけですが、さすがに数千件分やるのは無理。 ということで、どうしたかってことですが…
Google先生に尋ねてみた
なんだかありがちな作業な気がしたので、とりあえずGoogle先生に尋ねてみたところ、
ってのが引っ掛かって、コレキタ!ってなりましたが… 紹介されていた以下のシェルスクリプトを書いてみるものの
#!/bin/sh
for ADDRESS in `cat $1`
do
nslookup $ADDRESS | grep "Name:" | sed -e "s/ */ /g" | cut -d " " -f 2
done
うまくいかない。
$ nslookup 216.58.220.196
Server: 127.0.1.1
Address: 127.0.1.1#53
Non-authoritative answer:
196.220.58.216.in-addr.arpa name = nrt13s36-in-f196.1e100.net.
196.220.58.216.in-addr.arpa name = nrt13s36-in-f4.1e100.net.
Authoritative answers can be found from:
220.58.216.in-addr.arpa nameserver = ns1.google.com.
220.58.216.in-addr.arpa nameserver = ns4.google.com.
220.58.216.in-addr.arpa nameserver = ns3.google.com.
220.58.216.in-addr.arpa nameserver = ns2.google.com.
ns1.google.com internet address = 216.239.32.10
ns2.google.com internet address = 216.239.34.10
ns3.google.com internet address = 216.239.36.10
ns4.google.com internet address = 216.239.38.10
ってな感じで出るわけなので、
grep "Name:"
してもダメなわけね。ってのはわかったから、
grep "name"
データは出てくるんだけど… 一つのIPアドレスに対して複数の結果が出てきやがるもんだから困った。 それだけなら、Excelくんやらで加工してやろうかと思ったけど、 うまくnslookupできなかったやつとか、grepできなかったやつはエラーが出るでもなく、 記録されないだけなもんだから困った…
digコマンドを見直そう!
nslookupだと、エイリアスは除くとかもできなくて、うまくいきそうにないということで、 digコマンドをお勉強してなんとかしてやろうと。 いろいろ見たけど結局
がとても参考になった。
ついでにDNSレコードの基本も再確認したら、@ITがやっぱりまとまっていてわかりやすかった。
いろいろ試行錯誤が途中あったけど、 DNSの逆引きを実行するコマンド部分としては、
dig +noall -x <IPADDRESS> +ans +nottlid
で固まった。 が、やっぱりこの場合も、digコマンドでうまくデータを取得できなかったとき、 何もレスポンスがなく終わってしまうので、出力がなくて困った。
うまくいけばDNSの逆引き結果が返ってくる
$ dig +noall -x 74.125.204.121 +ans +nottlid
121.204.125.74.in-addr.arpa. IN PTR ti-in-f121.1e100.net.
$
うまくいかないと音沙汰なし
$ dig +noall -x 74.125.204.255 +ans +nottlid
$
さて、うまくいかなかったときの処理をどうするか…
条件分岐処理したいけど・・・
条件分岐処理をうまくかけてあげれればいいんだろうけど、 わたくしの現在のshell scriptをつくる技量では難しそうなので、 とりあえず断念して、ExcelやらVimやらで後から成形処理するときに、 うまくエラー部分を抽出できるようにしてあげる戦法で行くことにした。
そんなわけでできたshell scriptは・・・
妥協に妥協を重ね突貫工事的に作ったので、マシンのリソースは使うわ、 ネットワークのリソースは使うわで、頻繁に使うとしたら実用性に欠けるけど… たまにしかやらないならとりあえずってとこか。
#!/bin/bash
for ADDRESS in `cat $1`
do
echo "IPADDRESS=$ADDRESS:rDNSlookup="
dig +noall -x $ADDRESS +ans +nottlid
echo ";:"
done
ということで、digコマンドの前後にechoでテキストを差し込んであげて、 digコマンドで何も出力されなくても、最低限検索したIPアドレスは記録されるようにしてみた。 1つのIPアドレスに対して1行にしたいので、この後テキストエディタで置換処理をしたりして成形。
ってなこで、一応ミッション完了なのでした。
本当はしたかったこと
実は逆引き対象のIPアドレスのリストには、かなりの数のダブりがあったりしたので、 重複している分は一回だけ、digして、すでにdigで結果を得ている部分は、 もう一度DNSに問い合わせをしないで、問い合わせ済みのデータを使う とかできたら、少しはネットワークリソースを使わずに済んだのな。 あと、処理も少しは早くなったろうに…
きっと条件分岐とかうまく使えばできるんだろうけど。 今後の課題です。