ある日、ネットワーク内につないだ機器のIPアドレスが現地で分からなくなったので、調べてほしいと依頼がありました。当日は力技で何とかしましたが、もっと楽にできることあったので、振り返ってみます。
前提条件
幸いなことに、今回問題のネットワークでは、以下の点が分かっていました。
- 現地の機器をつないでいるネットワークへアクセスできるサーバーに、本社オフィスからアクセスできた。
- 探すべきIPアドレス帯は第3オクテットまで固定、かつ第4オクテットの範囲が決まっている。
- IPアドレスを指定してwgetが成功することで、そのIPが当たりと言える。
これなら何とかなりそうです。
当日の手段:力業
当日は仕方なかったので、こんなシェルスクリプトを書いて、見つかったらCtrl+Cで対応しました。
wget -t 1 -T 3 --spider http://X.X.X.1/hogehoge;
wget -t 1 -T 3 --spider http://X.X.X.2/hogehoge;
・・・
wget -t 1 -T 3 --spider http://X.X.X.99/hogehoge;
wget -t 1 -T 3 --spider http://X.X.X.100/hogehoge;
IP1個につき1回wgetし、3秒待機するコマンドを第4オクテットとして考えられる範囲分(上の例なら100行分)を書いています。URLの存在チェックができれば十分だったので、–spiderを付けました。最初から1行ずつ実行していくだけのコマンドです。
コマンド自体は表計算ソフトで量産できますが、都度作るのは煩雑です。一発でできるようにしたいです。
次回からはこれを使う:ワンライナー
xargsを使うことで、ワンライナーで実行できます。
$ seq 1 100 | xargs -I@ wget -t 1 -T 3 --spider http://X.X.X.@/hogehoge;
seqコマンドで生成された数を、xargs以下に渡しています。X.X.X.@ のアットマーク分がxargsの引数で変化し順次実行していきます。これで目標とした検索が実現できます。
1から順に確認して見つけたらCtrl+Cで止めるのは、力業と同じです。
Ctrl+Cを使わない方法はあるか
Ctrl+Cで止めない方法も考えたいと思って、for文でコマンドを試作してみました。
## 1から順番に数を調べて、3の倍数になったらループを抜ける例。
for v in `seq 1 10`; do if [ $((v % 3)) -eq 0 ]; then echo fuga; break; else echo $v; fi; done
実際書いてみると、単語が込み入って見づらいと感じました。これなら、素直にシェルスクリプトファイルにした方が見やすそうです。よりよい方法があるかもしれませんが、今回はこれ以上の調査を見送ります。
余談
「ワンライナー」という言葉を使いましたが、似た感じの言葉で「リニア」があります。「ライナー」と「リニア」の違いが気になって調べてみました。
- ライナー(liner)
- 定期運行する交通機関
- 「京成スカイライナー」「おはようライナー」の「ライナー」はこちらの意味
- リニア(linear)
- 一直線に伸びた感じの意味
- リニアモーターカー linear motor car
- 線形代数学 linear algebra