curlはwget, 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。
ユーザ認証
- -u/--user user[:password]
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/--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
リファラ指定
- -e/--referer URL
これも-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を保存
- -c/--cookie-jar file_ame
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/ #### => コンテンツが表示される
ftp
httpだけじゃなく、ftpダウンロード/アップロードもできる。defaultはanonymous loginしようとするので適宜-uで指定。また、httpと同じくファイルの内容は標準出力に出るのでリダイレクトするか、-o、-Oなどでfileに保存したほうが良い。
curl ftp://example.com/path/to/file
ディレクトリ作成
- --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
fileをftp upload
- -T/--upload-file file
curl -T /path/to/file ftp://example.com/path/to/upload
個人的にはごっつ便利でお気に入り機能です。今までサーバ間でファイル転送するときに手動でftp/scp叩いてたからなぁ。あと、manを見てたらhttpでもいけるらしいけど、どやってuploadするんだろう。webdav?