curlオプション覚え書き

2020年9月14日

BASH

いつからだったか、Mac に wget コマンドが標準で入らないようになってから curl コマンドを使うことが増えました。オプションをいつまで経っても覚えられないのでコピペ用にまとめ。随時更新。

目次

  1. よく使う fsL オプション
  2. ファイルのダウンロード
  3. tar ファイルをダウンロードして解凍するワンライナー
  4. レスポンスヘッダのみ取得する
  5. Authorization ヘッダを指定する
  6. ベーシック認証
  7. POST
  8. ポート番号を指定して疎通を確認する

よく使う fsL オプション

REST API を叩いて結果を確認したいとき curl -fsL のオプションをよく使います。

curl -fsL https://api.github.com

-f(--fail)
403, 404, 500 などエラーの時に標準出力にエラー文字を出さない

-s(--silent)
進捗の表示をしない

-L(--location)
リダイレクトする

ただ -s オプションは URL が間違っていたり、エラーがあっても何も表示しません。進捗の表示をしないけれどエラーがあったら表示をしたいときには -S(--show-error) を使います。-sS のように s オプションとセットで使います。

ファイルのダウンロード

2 パターンあります。

まずは -O オプション。大文字のアルファベットの O です。リモートのファイル名がそのままローカルのファイル名になります。ファイルのダウンロード先は変更できず、現在のディレクトリにダウンロードされます。

curl -O https://example.com/download/tools-1.20.2.tar.gz

次に -o オプション。小文字アルファベットの o です。出力をファイルに保存します。こちらはダウンロード先のディレクトリやファイル名の変更ができます。

curl -o /opt/tools.tar.gz https://example.com/download/tools-1.20.2.tar.gz

URL に & を含むファイルのダウンロード

URL に & を含む場合、うまくダウンロードができないことがあります。この場合は URL をダブルクオーテーションで囲みます。

curl -o /opt/tools.tar.gz "https://example.com/download/tools-1.20.2.tar.gz?expires=1642729958&signature=abcdefg"

多くのシェルでは & をつけるとバックグラウンド実行になるため、& があるとそこでコマンドが途切れてしまうようです。

& の有無に関わらず、URL はダブルクオーテーションで囲むようにしておくと良いと思います。

tar ファイルをダウンロードして解凍するワンライナー

curl コマンドと tar コマンドのあわせ技。-C オプションで解凍先を指定しています。

curl http://nginx.org/download/nginx-1.19.2.tar.gz | tar -zx -C /opt

レスポンスヘッダのみ取得する

-I, --headでレスポンスヘッダのみ取得できます。

curl -I https://example.com

-I オプションが利用できない場合は以下を使います。

curl -D - -s -o /dev/null https://example.com

-D オプションでファイルにレスポンスヘッダを出力します。-D(--dump-header) <filename> のように使います。filename-(ハイフン) を指定すると標準出力に出します。-s オプションで進捗を非表示にして、-o オプションに /dev/null を指定し、レスポンスボディを捨てています。

curl -H "Authorization: <type> <credentials>" https://example.com

<type> には BasicBearer などを指定します。詳細は Hypertext Transfer Protocol (HTTP) Authentication Scheme Registry を参照。

ベーシック認証

curl -u <user:password> https://example.com

-u, --user <user:password> のように指定します。Authorization ヘッダを使ってもよいですが Base64 でエンコードしなくてよいのでこちらのほうが楽。

POST

フォームデータを送信

curl -X POST -d "title=Title&content=Body" https://example.com

json を送信

curl -X POST -H "Content-Type: application/json" -d '{"title":"Title", "content":"Body"}' https://example.com

バイナリデータを送信

curl -X POST -H "cache-control: no-cache" -H "content-disposition: attachment; filename=photo.jpg" -H "content-type: image/jpeg" --data-binary "@/Users/karakaram/Pictures/photo.jpg" https://example.com

ポート番号を指定して疎通を確認する

telnet コマンドが入っていない時などに

curl -I example.com:443

-技術ブログ
-