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

ブログやってます。更新などはこちら。[地方エンジニアの学習日記](https://ryuichi1208.hateblo.jp/)


## 背景

curlコマンドを使う際に毎回調べて実行しているのですがさすがに面倒なのでまとめてみました。
自分のevernoteからの転載なので誤記などあったら教えてください。

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

サーバから、もしくはサーバへデータ転送を行うコマンド。
FTP,SFTP,LDAP,TELNETなど多くのプロトコルに対応している。
F5アタックなんかもワンライナーでさくっとできる。(悪用禁止)

一番基本的な使い方はHTTPリクエストを実施し、
その内容を標準出力するといった使い方でしょうか。
jsonをパースしてくれるjqは必須なので入れておきましょう。

書式は下記

``` bash
curl [options] [URL]
```

ちなみにソースは下記から見れます。
■ [curl/curl](https://github.com/curl/curl)

## 基本形

``` bash

# 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 -- レスポンスボディの出力先を指定する
```

# デバッグ系

``` bash
# HTTPレスポンスヘッダーの取得（-I）
$ curl -I http://対象のURL

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

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

# 小技系

``` bash
# ファイルに記載したリストからダウンロード(並列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" ;}
```

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

``` bash
# 転送速度に制限をかける
# 速度は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で使ってみる検証

``` bash
$ brew install curl jq
```

公式ドキュメント
https://qiita.com/api/v2/docs

## ユーザ情報を表示

``` bash
$ 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": ""
}
```

## 記事を取得

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

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

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

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

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

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

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

## 新規追加ユーザを表示

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

## /etc/hostsを書き換えずに名前解決を行う

意外と便利。
hostsをいちいち書き換える手間を無くしてくれるオプションです。
sniなapacheやらnginxで活躍してくれます。

```
$ curl --header "Host: www.example.com" http://192.168.1.1/
```

■ [curl –resolveでコマンドラインから名前解決する](https://siguniang.wordpress.com/2014/05/10/fake-http-request-hostname/)

## まとめ

認証を使わずともいろいろと遊ぶことができました。
認証を使って投稿などはいつかやってみたいです。(vimでQiita記事書けるのは熱いですね)

## 参考サイト

■　[Qiita API v2を利用してcurlで投稿してみた](https://cloudpack.media/44143)
■　[Qiita API v2 の概要(非公式)](https://qiita.com/tag1216/items/b0b90e30c7e581aa2b00)