カイワレの大冒険 Third

技術的なことや他愛もないことをたまに書いてます

curlコマンドの便利なオプションたち

curlコマンドのお話し。cURLって書くんですな。

対向のサーバとのやり取りを追いたいときに、通信内容を見たいわけですが、そういうときにcurlコマンドはちょくちょく便利なので、書いてみる。

要はtcpdumpとか使ってパケットまで見る必要はないんだけど、レスポンスとかは見たいときに便利だよって話し。

その1. 普通に使う

$ curl 'http://www.normal.com'
<<中略>>
var k=/^http:/i;if(k.test(g)&&google.https()){google.ml(new Error("GLMM"),false,{src:g});delete i[f];return}d.src=g;h.li=f+1},lc:[],li:0,Toolbelt:{},y:{},x:function(a,b){google.y[a.id]=[a,b];return false}};
    window.google.sn="webhp";window.google.timers={};window.google.startTick=function(a,b){window.google.timers[a]={t:{start:(new Date).getTime()},bfr:!(!b)}};window.google.tick=function(a,b,c){if(!window.google.tim
<<中略>>

どういうレスポンスが返ってきてるかボディの内容を標準出力してくれます。「-G」をつけて、GETメソッドを明示してデータ送りつけたりもできますが、まぁまずは普通に使ってみましょう。

その2. タイムアウトを定める

$ curl 'http://www.tunagaranai.com' --max-time 5

秒数を指定して、コマンド実行(the whole operation to take)そのものを「何秒以内に終わらせるか」を指定できます。ネットワークなどに問題があったりしてレスポンスが帰ってこない場合もあるので、指定しておいたほうがよいでしょう。

「--connect-timeout」ってのもありますが、これだと接続したあとにやたら待たされるようなものに関しては効かないので、「--max-time」でいいんじゃないかと思います。

その3. レスポンスの出力を加工する

curlには「-w」というオプションがあり、出力の内容を加工できます。ただし、全ての結果を出力しおわったあとなので、grepなどで絞り込んだほうがよいでしょう(正規表現使ったほうがよいかも…)。使い方はこんな感じ。

$ curl 'http://www.wannasee.co.jp' -w "status:%{http_code}" 2>/dev/null | fgrep 'status:'

「-w」というオプションを使い「%{VAL}」という形式で、VALの部分に変数名をぶちこみます。

使える変数は以下のようなもの(一部)。

  • http_code
  • time_total
  • size_request
  • content_type

ステータスコードはわりと便利なので、個人的には重宝してます。headメソッド許可されてるとは限らないし、下手にオプション使うよりはいいんじゃないかと。
2012/05/03追記:
curlでボトルネック調査をする - 256bitの殺人メニューに、「-w @TEMPLATE」という感じで@つきでテンプレートファイルを指定して、出力を加工する方法が書かれています。すごいすごい。



その4. やり取りを見る

$ curl 'https://www.trace.net' --trace trace.log
$ less trace.log
== Info: About to connect() to www.trace.net port 443 (#0)  == Info:   Trying 74.125.235.120... == Info: connected
== Info: Connected to www.trace.net (74.125.235.120) port 443 (#0)
中略
=> Send header, 171 bytes (0xab)  0000: 47 45 54 20 2f 20 48 54 54 50 2f 31 2e 31 0d 0a GET / HTTP/1.1..  0010: 55 73 65 72 2d 41 67 65 6e 74 3a 20 63 75 72 6c User-Agent: curl  0020: 2f 37 2e 31 39 2e 37 20 28 78 38 36 5f 36 34 2d /7.19.7 (x86_64-
中略
00d0: 28 29 29 3b 0a 7d 29 28 29 3b 0a 3c 2f 73 63 72 ());.})();.</scr
00e0: 69 70 74 3e                                     ipt>
<= Recv data, 7 bytes (0x7)
0000: 0d 0a 30 0d 0a 0d 0a                            ..0....
== Info: Connection #0 to host www.trace.net left intact
== Info: Closing connection #0

「--trace FILENAME」として、やり取りの内容をファイルに出力してくれます。まぁ、どういうデータをやり取りしてるかを見れるので、トレースしたいときは便利ですな。大事なときに意外と活躍してくれる気がする。

終わりに

まぁ、curlって使えない OR 入れられないサーバって早々ないですし、オプション駆使すれば色々できるので、HTTPクライアント実装しなきゃぁぁぁということすら考えず、非常に便利な代物だったりします。

場面場面でちょくちょく活躍してくれるので、自分がよく使うものをまとめてみました。もし他にもいい使い方あれば是非コメントを!あと、man読むと面白いよ!

おまけ PUTメソッドを使う

@kuwa_tw氏から教えてもらったという。curlってPUTもできるんですな。

$ curl -w 'status:%{http_code}' -T uploadtest.txt http://localhost/uploads/

のように、「-T」オプションを使うと、PUTメソッドが使えたりします。すごいすごい。

2012/05/03追記:
あと意見頂いたのが、「-X」オプションが便利という件。「common additional HTTP requests include PUT and DELETE, but related technologies like
WebDAV offers PROPFIND, COPY, MOVE and more.」とか「(FTP) Specifies a custom FTP command to use instead of LIST when doing file lists with
FTP.」とかmanにはあって、メソッド指定できるので、明示しておいてもいいかもですね。

まぁ、頻繁に使うGET, POSTでも。
curl深い…