よく使うcurlコマンドのオプション


背景

curlコマンドを使う際に毎回調べて実行しているのですがさすがに面倒なのでまとめてみました。

自分のevernoteからの転載なので誤記などあったら教えてください。


curl(カール)コマンドとは

サーバから、もしくはサーバへデータ転送を行うコマンド。

FTP,SFTP,LDAP,TELNETなど多くのプロトコルに対応している。

F5アタックなんかもワンライナーでさくっとできる。(悪用禁止)

一番基本的な使い方はHTTPリクエストを実施し、

その内容を標準出力するといった使い方でしょうか。

jsonをパースしてくれるjqは必須なので入れておきましょう。

書式は下記

curl [options] [URL]

ちなみにソースは下記から見れます。

curl/curl


基本形


# HTTPリクエストを実施し結果を標準出力へ
$ curl http://対象のURL

#コンマや[]を使って範囲指定も出来る
$ curl 'http://{one,two,three}.example.com'
$ curl 'http://[1-3].example.com'

# 実行結果をファイルへ出力
$ curl http://対象のURL > 出力先
$ curl -o 出力先PATH http://対象のURL

# ファイル出力時の進捗状況を非表示にする(エラーも非表示)
$ curl -s -o 出力先PATH http://対象のURL

# 上記でエラーは表示したい場合
$ curl -sS -o 出力先PATH http://対象のURL

# プログレスバーで進捗率を表示
$ curl -# -O http://対象のURL

# SSL接続で証明書エラーをスキップ
$ curl -k https://対象のURL

# URLのファイル名でダウンロード (下記はindex.htmlで保存される)
$ curl -O http://対象のURL/index.html

# プロキシ経由でアクセスする
$ curl -x プロキシサーバ:ポート番号 --proxy-user ユーザ名:パスワード http://対象のURL

# リダイレクトを有効にする
$ curl -L http://対象のURL

# ダウンロードを中断したときに再度ダウンロードを再開するとき
$ curl -C - http://対象のURL

# HTTPメソッドの指定(-X)
$ curl -X PUT http://対象のURL

よく使うオプションは下記3つ

これだけ覚えておけば正直なところ大体ことは足りる気がします。

-L -- リダイレクトがあったらリダイレクト先の情報を取る

-s -- 余計な出力をしない
-o -- レスポンスボディの出力先を指定する


デバッグ系

# HTTPレスポンスヘッダーの取得(-I)

$ curl -I http://対象のURL

# 詳細をログ出力(-vもしくは--verbose)
$ curl -v http://対象のURL

# 終了ステータスのみを表示
$ curl -s http://対象のURL -o /dev/null -w '%{http_code}\n'


小技系

# ファイルに記載したリストからダウンロード(並列5プロセスで実行)

$ cat url.list | xargs -L1 -P5 curl

# 複数ファイルを同時ダウンロード
$ curl -O http://対象のURL/fuga.txt -O http://対象のURL/hogera.txt

# DDosテスト(悪用厳禁)
$ for((;;)){ curl -v --header "Connection: keep-alive" "http://対象のURL" ;}


その他(あまり使わない)

# 転送速度に制限をかける

# 速度は10k, 1m, 1gで指定する
$ curl --limit-rate 制限する転送速度 http://対象のURL

# 認証を行う
$ curl --anyauth --user ユーザ名:パスワード http://対象のURL

# 最大リダイレクト回数を指定
$ curl -Z 2 -L http://対象URL

# 受信クッキーの保存
$ curl -c cookie.txt http://対象のURL

# 保存クッキーの送信
$ curl -b cookie.txt http://対象のURL

# 最大接続時間制限を設ける
$ curl --connect-timeout 600 http://対象のURL


使ったことあるオプションまとめ

manを見ると知らないオプションが多いことに気づいた。

正直一生使わないオプションが多い気がする。。

とりあえず使った覚えのあるオプションのみを抜粋してまとめて見ました。

オプション
説明

-d, –data PARAM
POSTリクエストとしてフォームを送信する。

-e, –referer
URL リファラーをURLで指定する

-f, –fail
サーバエラーが発生したら黙って終了する

-i, –include
HTTPヘッダを出力に含める

-m, –max-time
TIME 最大転送時間をTIME秒に制限する

-o FILE
取得したデータを指定したファイルFILEに出力する

-s, –silent
進捗状況やエラーを表示しない

-u USER[:PASS]
認証に用いるユーザー名USER, パスワードPASSを指定する(基本認証など)

-v, –verbose
処理状況の更なる詳細や説明を出力させます。

-x HOST[:PORT]
プロキシサーバとしてホストHOSTおよびポートPORTを利用

-y, –speed-time
転送速度が指定した速度をTIME秒の間下回ったらダウンロードを終了する。

-A, –user-agent
AGENT ユーザーエージェントAGENTを指定

-H, –head
HEADER HTTPヘッダにHEADERを追加もしくは変更する

-I, –head
ヘッダ情報を取得する

-O, –remote-name
取得したデータを標準出力ではなくファイルに出力する

-R, –remote-time
ダウンロードしたファイルのタイムスタンプをサーバ上のタイムスタンプに合わせる

-L, –location
要求したページにリダイレクトが掛かっていた場合に追従する

全部知りたい人は下記をご参照ください。

http://www.mit.edu/afs.new/sipb/user/ssen/src/curl-7.11.1/docs/curl.html


ここからはQiita APIをCulrで使ってみる検証

$ brew install curl jq

公式ドキュメント

https://qiita.com/api/v2/docs


ユーザ情報を表示

$ curl --silent "https://qiita.com/api/v2/users/ryuichi1208" | jq .

{
"description": "社会人2年目\r\nひょっこエンジニア",
"facebook_id": "ryuuichi.watanabe.3",
"followees_count": 36,
"followers_count": 29,
"github_login_name": "ryuichi1208",
"id": "ryuichi1208",
"items_count": 46,
"linkedin_id": "",
"location": "",
"name": "",
"organization": "",
"permanent_id": 258841,
"profile_image_url": "https://qiita-image-store.s3.amazonaws.com/0/258841/profile-images/1543146775",
"twitter_screen_name": "ryuichi_1208",
"website_url": ""
}


記事を取得

$ curl --silent "https://qiita.com/api/v2/items/[記事ID]" | jq .


最新の記事のタイトル取得

$ curl --silent "https://qiita.com/api/v2/items?page=1&per_page=20" | jq . | grep '"title'


指定したユーザの投稿記事を取得

curl --silent "https://qiita.com/api/v2/users?page=1/[ユーザID]/items" | jq . | grep '"ti

tle'


指定したユーザがストックしている記事のタイトルを表示

$ curl --silent "https://qiita.com/api/v2/users/[ユーザID]/stocks" | jq . | grep '"title'


新規追加ユーザを表示

$ curl --silent "https://qiita.com/api/v2/users" | jq .


まとめ

認証を使わずともいろいろと遊ぶことができました。

認証を使って投稿などはいつかやってみたいです。(vimでQiita記事書けるのは熱いですね)


参考サイト

■ Qiita API v2を利用してcurlで投稿してみた

■ Qiita API v2 の概要(非公式)