curlのオプション勉強したのでまとめ

curlwget, lwp-request(GET, HEAD), lynxと同じようなcliのhttp client。だと思ってたらもっと機能があるようなので、man curl読んで色々調べてみた。HTTP(S)以外にもかなり対応してた。

curl is a tool to transfer data from or to a server, using one of the supported protocols (HTTP, HTTPS, FTP, FTPS, SCP, SFTP, TFTP, DICT, TELNET, LDAP or FILE).

とりあえず良く使いそうなhttp, ftp関連のメモ。DLだけじゃなくて、アップロードもできるのが素晴らしい。


基本

syntax
curl [optinons] URL
URL

It will then default to HTTP but try other protocols based on often-used host name prefixes.
For example, for host names starting with "ftp." curl will assume you want to speak FTP.

protocolを省略するとdefaultではHTTPになるけど、ftp.exmaple.comのようなhostだったら名前から推測してFTPする。

あと{}や[]を使って、複数指定することも可能。ただし、{}はシェルが展開してしまうので範囲指定のときはシングルクォートしたほうが無難。

  • コンマで複数指定
curl 'http://{one,two,three}.example.com'
  • []を使って範囲指定
curl 'ftp://example.com/[1-10].txt'
curl 'ftp://example.com/[a-z].txt'

1.txt ~ 10.txt, a.txt ~ z.txtまでをDL。

  • 範囲のstepも指定

これが出来るのはcurl 7.15.1以降

curl 'ftp://example.com/[1-10:2].txt'

2つずつ、つまり1, 3, 5, 7, 9.txtをDL。

proxyサーバを指定
  • -x/--proxy host[:port]

portはdefualtで1080

socks proxyサーバを指定
  • --socks5 host[:port]

portはdefualtで1080

ユーザ認証
  • -u/--user user[:password]

httpのbasic認証ftpのログインとかに。

curl -u user:password http://example.com/

引数にpasswordを与えなければ、promptで聞かれる。(historyに残したくないときとか)

メソッドを指定

varnish, webdav などを利用する際に。例えばvarnishでcacheをpurgeする際に-X PURGE を指定。(varnish側のvclでそういう設定をしておく必要あり)

curl -X PURGE http://example.com/path/to/url
ファイルに保存

defualtでは結果を標準出力に出すので、ファイルにリダイレクトするか、-oでfilenameを指定して保存。

curl -o index.html http://example.com/index.html

範囲指定を使っているときは"#n"の特殊変数が使える。

curl http://{one,two}.example.com -o "file_#1.txt"
## file_one.txt, file_two.txt
curl http://{one,two}.example.com/[1-2] -o "#1_#2.txt"
## one_1.txt one_2.txt, two_1.txt two_2.txt
URLのfilenameで保存
  • -O/--remote-name

-oと似ているけど、こっちのほうが楽かも。アクセスしたファイルがhoge.txtなら、それと同じ名前で保存する。

curl -O http://exapmle.com/index.html
## index.htmlとして保存される

-oの例のようにhost名前を展開している場合はだめだけど、ファイル名を展開しているだけなら

curl -O 'http://example.com/image/image[001-100].jpg'

としたら001.jpgから100.jpgまで保存する。-oみたく#1とか書かなくてよい。

帯域制限
  • --limit-rate speed

speedは10k, 1m, 1gなどで。回線/サーバに負荷を掛けたくないときに。

各種status結果を表示
  • -w/--write-out format

特殊変数で%{variable_name}のようなformatが使える。http_code、time_totalなど。詳細はman curl。例えば、

curl http://example.com/ -o /dev/null -w "status: %{http_code}, time: %{time_total}\n" 2> /dev/null >> status.log

とかを定期的に流しておけば、httpのstatusと応答時間をログに取れる。みたいな。

traceする

Enables a full trace dump of all incoming and outgoing data

tcpdump -Xのような感じ。16進数とASCIIを表示する。困ったときにdebugするときに使うかも。

  • --trace filename

filenameを"-"にすると標準出力に出る。

curl example.com --trace trace.log
  • --trace-ascii filename

--traceと似ているが、16進数は表示しない。あとASCIIはLFで改行して表示してくれる。

This is very similar to --trace, but leaves out the hex part and only shows the ASCII part of the dump

http関連

HTTP headerも表示
  • -i/--include

出力にHTTP-headerを含める。apacheの設定確認をするときに便利。

HTTP headerのみ表示
  • -I/--head

HEADメソッドを送ったときと同じ。bodyは表示しない。

HTTP headerをfileに保存
  • -D/--dump-header file
redirect先に再接続する
  • -L/--location

30XでRedirectが返ってきたときに、LocationヘッダのURLにもう一度アクセスする。lwp-requestの-Sオプションのような感じで。これは通常、付けといたほうが良いかも。

curl -L http:/example.com/
認証情報を送るとき

--userで認証情報を送った場合はredirect先のhostには送られない。redirect先のhostにも認証情報を送る場合は

curl --location-trusted http://example.com/

無闇に使うと、うっかり怪しげなサイトにredirectされてパスワード盗まれかねないので、信頼してるサイトでのみ使うべき。とのこと。

redirectの最大回数を指定
  • --max-redirs num

ループするといけないのであわせて指定する。defaultは50。

HTTP request ヘッダ指定
  • -H/--header header_string

Hostヘッダや色んなヘッダを送りつけたいときに。

curl -H 'host: hoge.example.com' example.com
ユーザエージェント指定
  • -A/--user-agent agetn_string

↑の-HでUser-Agent: hogeと指定しても良い。

curl -A 'Mozilla/4.0' example.com
リファラ指定

これも-Hで指定しても良いけど。○○な画像とかをDLするときとかに大活躍!

curl -e 'http://example.com/upload.cgi' http://example.com/img/hoge.jgg
cookieを送信

cookie_dataのformatは"NAME1=VALUE1; NAME2=VALUE2"のような文字列。もしcookie_dataに"="が含まれていない場合、filenameとして扱われる。つまり、後述するオプションでcookieを保存しておけば

curl -b example.cookie http://example.com/
cookieを保存

filenameが"-"だと、cookieは標準出力に出る。

curl -c example.cookie http://example.com/
POSTでformデータ送信
  • -d/--data name=value

データが複数ある場合は'&'でつなげるか、-dを複数回指定。また、-dオプションの場合はcontent-typeは"application/x-www-form-urlencoded"になる。fileを送信する場合は次の-Fで。

curl -d username=hoge -d password=fuga http:/example.com/

'%'、'&'などを送信する場合はURLエンコードした、'%25', '%26'などの値を送らないとダメ。自動的に変換させて送信したい場合は--data-urlencodeを使う

POSTデータをurlエンコードして送信
  • --data-urlencode
curl -d user=hoge --data-urlencode pass='pass&word' http://example.com/
POSTでfileをupload
  • -F/--form name=content

こちらはcontent-typeは"multipart/form-data"になる。contentの前に"@"があると、filenameとして扱われる。nameはformのID。

curl -F password=@/etc/passwd password.example.com

uploadするfileのcontent-typeの指定も可能。

curl -F "web=@index.html;type=text/html" url.example.com
コンテンツ圧縮
  • --compressed

HTTP通信を圧縮して、展開されたものを出力に表示する。libcurlがsupportしているアルゴリズムが選択される。HTTPヘッダ見ると、こんなのが追加される。

Accept-Encoding: deflate, gzip

もちろんwebサーバ側がコンテンツ圧縮に対応している必要あり。

SSL証明書の警告を無視する
  • -k / --insecure

defaultでは証明書の警告があると、接続できない。(CNが違う、期限が切れている、中間証明書がおかしいなど)

$ curl https://badcommonname.example.com/ 
url: (60) SSL certificate problem, verify that the CA cert is OK. Details:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
More details here: http://curl.haxx.se/docs/sslcerts.html
(中略)
If you'd like to turn off curl's verification of the certificate, use
 the -k (or --insecure) option.
$ curl --insecure curl https://badcommonname.example.com/
#### => コンテンツが表示される

言い換えれば、curlhttpsの簡易チェックができる。

ftp

httpだけじゃなく、ftpダウンロード/アップロードもできる。defaultはanonymous loginしようとするので適宜-uで指定。また、httpと同じくファイルの内容は標準出力に出るのでリダイレクトするか、-o、-Oなどでfileに保存したほうが良い。

curl ftp://example.com/path/to/file
list表示

ディレクトリを指定すると一覧が表示される。

curl ftp://example.com/path/to/dir
filenameだけ表示
  • -l/--list-only

ディレクトリ指定時に、timestampなどを表示しない。

ディレクトリ作成
  • --ftp-create-dirs

defaultでは存在しないディレクトリをpathに指定すると失敗する。

$ curl ftp://example.com/not/exist/
curl: (9) Server denied you to change to the given directory
$ curl ftp://example.com/not/exist/ --ftp-create-dirs

mkdir -p(mkdirhier)みたいに親ディレクトリがなかった場合は親ディレクトリも作成してくれる。

fileをftp upload
  • -T/--upload-file file
curl -T /path/to/file ftp://example.com/path/to/upload

個人的にはごっつ便利でお気に入り機能です。今までサーバ間でファイル転送するときに手動でftp/scp叩いてたからなぁ。あと、manを見てたらhttpでもいけるらしいけど、どやってuploadするんだろう。webdav

EPSV (extended passive)を無効にする
  • --disable-epsv

defaultではEPSVを試行して、それがダメならその後にPASVモードになる。FTPサーバがEPSVに対応してても、NATルータとかがEPSVを解釈してくれないと、タイムアウトを待たないといけない。そんなときに指定すると良い。

EPSVについてはこっちで。