⚠️ 記事内に広告を含みます。

curlの使い方

curlコマンド

curlで情報を取得する

httpをはじめとして様々なプロトコル上でデータの受信や送信を行うことができるコマンドラインツールです。

URLを入力してページの内容を取得

URLを入力するとページの内容を取得できます。

$ curl exapmle.com
<!doctype html>
<html>
<head>
    <title>Example Domain</title>

    <meta charset="utf-8" />
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <style type="text/css">
    body {
        background-color: #f0f0f2;
~~~~~

リダイレクト先を追う Lオプション

リダイレクトが発生する場合はLオプションを入れます。

$ curl example.com
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>301 Moved Permanently</title>
</head><body>
<h1>Moved Permanently</h1>

$ curl -L example.com

Lオプションはリダイレクトがあってもなくても問題ないので、デフォルトで入れて実行することが多いです。

httpヘッダだけ見たい Iオプション

中身ではなく、ヘッダだけ見たい場合はIオプションを使用します。

# curl -I  example.com
HTTP/1.1 200 OK
Content-Encoding: gzip
Accept-Ranges: bytes
Age: 369158
Cache-Control: max-age=604800
Content-Type: text/html; charset=UTF-8
Date: Thu, 05 May 2022 07:58:13 GMT
Etag: "3147526947"
Expires: Thu, 12 May 2022 07:58:13 GMT
Last-Modified: Thu, 17 Oct 2019 07:18:26 GMT
Server: ECS (chb/0286)
X-Cache: HIT
Content-Length: 648

ヘッダ+本文も取得したい場合はiオプションを使用します。

ファイル出力、コマンドに渡す時に進行状況を隠す -sオプション

例えばパイプを使ってheadに渡すような場合には進行状況も標準出力に出てしまいます。

$ curl -iL  example.com | head
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  1256  100  1256    0     0  44959      0 --:--:-- --:--:-- --:--:-- 46518
HTTP/1.1 200 OK
Age: 369246
Cache-Control: max-age=604800
Content-Type: text/html; charset=UTF-8
Date: Thu, 05 May 2022 07:59:41 GMT
Etag: "3147526947+ident"
Expires: Thu, 12 May 2022 07:59:41 GMT
Last-Modified: Thu, 17 Oct 2019 07:18:26 GMT
Server: ECS (chb/0286)
Vary: Accept-Encoding

-sオプションを使うと出力されなくなります。

# curl -siL  example.com | head -n20
HTTP/1.1 200 OK
Age: 369269
Cache-Control: max-age=604800
Content-Type: text/html; charset=UTF-8
Date: Thu, 05 May 2022 08:00:04 GMT
Etag: "3147526947+ident"
Expires: Thu, 12 May 2022 08:00:04 GMT
Last-Modified: Thu, 17 Oct 2019 07:18:26 GMT
Server: ECS (chb/0286)
Vary: Accept-Encoding
X-Cache: HIT
Content-Length: 1256

<!doctype html>
<html>
<head>
    <title>Example Domain</title>

    <meta charset="utf-8" />
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />

ファイルの書き出し -oオプション

出力内容をファイルに書き出すには -oオプションの後に出力のパスを書くとそのファイル名で保存することができます。

# curl -o ./example.com_output example.com
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  1256  100  1256    0     0  46722      0 --:--:-- --:--:-- --:--:-- 48307

# head example.com_output
<!doctype html>
<html>
<head>
    <title>Example Domain</title>

    <meta charset="utf-8" />
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <style type="text/css">
    body {

デバッグ情報を得る -vオプション

詳しいデバッグ情報を取得したい場合は-vオプションを利用します。

# curl -v  example.com
* About to connect() to example.com port 80 (#0)
*   Trying 93.184.216.34...
* Connected to example.com (93.184.216.34) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
> Host: example.com

リクエストメソッドを指定する

-Xを使用してGETやPOSTなどのリクエストメソッドを指定することができます。

# curl -I -X GET example.com
HTTP/1.1 200 OK
Age: 369819
Cache-Control: max-age=604800
Content-Type: text/html; charset=UTF-8
Date: Thu, 05 May 2022 08:09:14 GMT
Etag: "3147526947+ident"
Expires: Thu, 12 May 2022 08:09:14 GMT
Last-Modified: Thu, 17 Oct 2019 07:18:26 GMT
Server: ECS (chb/0286)
Vary: Accept-Encoding
X-Cache: HIT
Content-Length: 1256

許可されているリクエストメソッドを取得する方法

サーバに対するリクエストメソッドのうちGETやHEAD、POST以外の不要なメソッドが制限されている場合があります。

例えばnginxでは下記のように記述することでGET,POST,HEAD以外は拒否できます。

  limit_except  GET POST HEAD
 {
    allow  192.168.0.0/16;
    deny   all;
 }

どのリクエストメソッドが有効かを調べるには下記のようにcurlで取得することができます。

$ curl -i -X OPTIONS https://example.com

HTTP/2 200
server: nginx
date: Thu, 05 May 2022 07:26:36 GMT
content-type: text/html; charset=UTF-8
content-length: 0
allow: GET,POST,OPTIONS,HEAD
cache-control: max-age=0, no-cache, no-store, must-revalidate
pragma: no-cache
expires: Mon, 29 Oct 1923 20:30:00 GMT
accept-ranges: bytes

許可されていないリクエストメソッドを要求した場合はサーバから下記のように返答が返ってきます。

HTTP/1.1 405 Method Not Allowed
Server: nginx
Date: Thu, 05 May 2022 07:39:56 GMT
Content-Type: text/html
Content-Length: 2753
Connection: keep-alive
→405とは限らない

curlで整形したテキストファイルをPOSTする

$ cat text | sed -e 's/no//g' curl -X POST "https://example.com" -d @-

curlでIPやホストを指定する方法

example.comというサイトのリニューアルをする時などは別サーバに構築してからexample.comのIPを変更して反映させるという場合があります。

$ dig example.com  192.168.0.1
↑現在のIPアドレスは192.168.0.1のサーバ

サイトリニューアルするサーバは192.168.0.10に変更する予定
$ curl -IL example.com
こうすると現行サーバ(192.168.0.1)にいってしまう。
192.168.0.10のサーバを見てほしい

こんなときにはドメイン名を指定しつつ、IPアドレスを変更する方法があります。

Hostsに書かずにcurlでテストする方法curlでIPやドメイン・ホスト名を指定する方法

curlでbasic認証を突破する方法

basic認証が設定されたサイトにcurlをすると401の認証エラーが返ってきてみれません。

HTTP/1.1 401 Unauthorized
Server: nginx
Date: Wed, 17 Aug 2022 04:57:42 GMT
Content-Type: text/html
Content-Length: 172
Connection: keep-alive
WWW-Authenticate: Basic realm="Restricted"

そんな時はユーザ名とパスワード組み込んでcurlしましょう

curlでbasic認証のユーザ名とパスワードを入力する方法

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です