いつからだったか、Mac に wget コマンドが標準で入らないようになってから curl コマンドを使うことが増えました。オプションをいつまで経っても覚えられないのでコピペ用にまとめ。随時更新。
目次
- よく使う fsL オプション
- ファイルのダウンロード
- tar ファイルをダウンロードして解凍するワンライナー
- レスポンスヘッダのみ取得する
- Authorization ヘッダを指定する
- ベーシック認証
- POST
- ポート番号を指定して疎通を確認する
よく使う 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
を指定し、レスポンスボディを捨てています。
Authorization ヘッダを指定する
curl -H "Authorization: <type> <credentials>" https://example.com
<type>
には Basic
や Bearer
などを指定します。詳細は 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