ngrepを使ってみた

Furlの問題を調べるときに、ソースコードに手を入れたのですが、
さすがにそんなことやってられないだろってことでツールがないか調べてみた
ところ、ngrepというのが簡単に使えそうだったので、それについて書きます。
wiresharkなんかでもできるんだろうけど、お手軽ではなさそうだったので
今回はパス。本格的に調べたいときはそちらの方がいいと思うんですけどね。

インストール

パッケージにありますので、それを使います。

  % sudo port install ngrep (Mac Ports)
  % sudo aptitude install ngrep (Ubuntu 10.10) 

依存ライブラリも大して多くないので、問題なくインストールできる
かと思います。

利用する

この手のツールは全然詳しくないのですが、tcpdumpと似ていると思います。
HTTPの送信ヘッダを見る場合は以下のようなコマンドになると思います。

  % sudo ngrep -W byline -d (インタフェース) port 80

インタフェースは ifconfigコマンドで調べられます。イーサネットケーブルで
接続していれば指定する必要もないと思いますが、無線 LAN、だったり複数
イーサネットカードを使っているという場合は指定する必要があるでしょう。
無線 LANの場合、MacBooKProなら en1、Ubuntuだと wlan0のような名前かと
思います。具体例は以下のような感じです。

  % sudo ngrep -W byline -d en1 port 80

そして別の端末から、

  % curl http://www.commandlinefu.com/commands/matching/ssh/c3No/json

とすると、ngrepを実行した端末に大量の出力が現れます。出力の一番初めの
方がを見ると、ヘッダ情報がありました。以下のとおりです。(ログを出力
するオプションは '-O'のようです。)

GET /commands/matching/ssh/c3No/json HTTP/1.1
User-Agent: curl/7.21.2 (x86_64-apple-darwin10.4.0) libcurl/7.21.2 OpenSSL/1.0.0c zlib/1.2.5 libidn/1.19
Host: www.commandlinefu.com
Accept: */*

目的のものが得られました。

まとめ

ソースコードに手を入れなくても、ngrepを使うことで送信ヘッダを確認する
ことができました。挙動を自分なりに確かめたいって場合にソースコード
ごにょごにょするのはすごくいいことですが、デバッグのときはあまりおすすめ
できません。特にリリースしてしまったものの場合は。1byteでも変わってしまうと、
同じものとは言えませんのでね。

なんで、ソースを変更することなく、確認・デバッグする
手段を抑えておくってことはすごく大切なことだと思います。


なお ngrepはその名の通り、マッチ条件を指定できるので、ここで示した
以上のことは当然できます。詳しい使い方は manかり、Usage
見ればよいかと思います。