hana_shinのLinux技術ブログ

Linuxの技術情報を掲載しています。特にネットワークをメインに掲載していきます。

curlコマンドの使い方



1 curlコマンドとは?

ファイルのダウンロードやアップロードを行うためのコマンドです。

2 環境

2.1 ネットワーク構成

サーバとクライアントの2台構成です。図中のeth0はNICの名前です。また、ホスト名の下はIPv4,IPv6アドレス(リンクローカルアドレス)を表しています。

client(eth0) -----------------------------------------(eth0) server
192.168.122.181                                       192.168.122.216
fe80::41c0:1283:fe8c:ef3b/64                          fe80::1f5d:b4c1:979d:359f/64

2.2 版数

サーバとクライアントのCentOS版数は以下のとおりです。

[root@server ~]# cat /etc/centos-release
CentOS Linux release 7.9.2009 (Core)

カーネル版数は以下のとおりです。

[root@server ~]# uname -r
3.10.0-1160.el7.x86_64

curlの版数は以下のとおりです。

[root@server ~]# curl -V
curl 7.29.0 (x86_64-redhat-linux-gnu) libcurl/7.29.0 NSS/3.44 zlib/1.2.7 libidn/1.28 libssh2/1.8.0
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp scp sftp smtp smtps telnet tftp
Features: AsynchDNS GSS-Negotiate IDN IPv6 Largefile NTLM NTLM_WB SSL libz unix-sockets

3 基本的な使い方

www.example.comにアクセスしてみます。サーバ、クライアントどちらで実行しても構いません。ここでは、クライアントで実行してみます。なお、www.example.comは、ドキュメントに例示用として使えるドメインとして、RFC2606で予約されています。

[root@client ~]# curl https://www.example.com
<!doctype html>
<html>
<head>
    <title>Example Domain</title>
-snip-

4 ファイルを保存する方法

4.1 リモートのファイル名で保存する方法(-O)

理研のサーバからbcパッケージをダウンロードしてみます。bcパッケージを選択した理由は、ファイルサイズが小さく、確認が早く終わるからです。

[root@client ~]# curl -O http://ftp.riken.jp/Linux/centos/7.9.2009/os/x86_64/Packages/bc-1.06.95-13.el7.x86_64.rpm
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  114k  100  114k    0     0   953k      0 --:--:-- --:--:-- --:--:--  962k

ダウンロードしたbcパッケージを確認します。理研のサーバで保存されていたファイル名でダウンロードできたことがわかります。

[root@client ~]# ls -l bc-1.06.95-13.el7.x86_64.rpm
-rw-r--r--. 1 root root 117272  7月  6 21:18 bc-1.06.95-13.el7.x86_64.rpm

4.2 任意の名前を付けて保存する方法(-o)

bcパッケージをtest.rpmという名前で保存してみます。

[root@client ~]# curl -o test.rpm http://ftp.riken.jp/Linux/centos/7.9.2009/os/x86_64/Packages/bc-1.06.95-13.el7.x86_64.rpm
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  114k  100  114k    0     0   880k      0 --:--:-- --:--:-- --:--:--  887k

ダウンロードしたbcパッケージを確認します。 test.rpmという名前でbcパッケージが保存されたことがわかります。

[root@client ~]# ls -l test.rpm
-rw-r--r--. 1 root root 117272  7月  6 21:21 test.rpm

4.3 複数ファイルをダウンロードする方法

複数ファイルを一括でダウンロードする場合、curl -O URL1 -O URL2として実行します。

root@client ~]# curl -O http://ftp.riken.jp/Linux/centos/7.9.2009/os/x86_64/Packages/bcc-0.10.0-1.el7.x86_64.rpm -O http://f
tp.riken.jp/Linux/centos/7.9.2009/os/x86_64/Packages/bcc-devel-0.10.0-1.el7.x86_64.rpm
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  566k  100  566k    0     0  1397k      0 --:--:-- --:--:-- --:--:-- 1396k
100 67632  100 67632    0     0  1431k      0 --:--:-- --:--:-- --:--:-- 1431k

ダウンロードしたbccパッケージを確認します。

root@client ~]# ls -l bcc-*
-rw-r--r--. 1 root root 580524  7月  6 21:27 bcc-0.10.0-1.el7.x86_64.rpm
-rw-r--r--. 1 root root  67632  7月  6 21:27 bcc-devel-0.10.0-1.el7.x86_64.rpm

5 HTTPヘッダのみ表示する方法(-I)

[root@client ~]# curl -I https://www.example.com
HTTP/1.1 200 OK
Content-Encoding: gzip
Accept-Ranges: bytes
Age: 413874
Cache-Control: max-age=604800
Content-Type: text/html; charset=UTF-8
Date: Wed, 06 Jul 2022 12:33:00 GMT
Etag: "3147526947"
Expires: Wed, 13 Jul 2022 12:33:00 GMT
Last-Modified: Thu, 17 Oct 2019 07:18:26 GMT
Server: ECS (sab/56F3)
X-Cache: HIT
Content-Length: 648

6 proxy経由でアクセスする方法(-X)

クライアントからサーバのproxy server経由で東京都のHPにアクセスしてみます。構成は以下のとおりです。

6.1 事前準備

ncコマンドを使って、proxyサーバを起動します。proxyサーバは8080番ポートでListenするようにします。ncコマンドの使い方は、ncコマンドの使い方(ネットワーク実験の幅が広がるなぁ~) - hana_shinのLinux技術ブログを参照してください。

[root@server ~]# nc -l 8080 --proxy-type http

ncプロセスがListenしているポート番号を確認します。ncプロセスはTCPの8080番ポートでListenしていることがわかります。なお、lsofコマンドの使い方は、lsofコマンドの使い方 - hana_shinのLinux技術ブログを参照してください。

[root@server ~]# lsof -c nc -a -i -a -nP
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nc      1177 root    3u  IPv6  28514      0t0  TCP *:8080 (LISTEN)
nc      1177 root    4u  IPv4  28515      0t0  TCP *:8080 (LISTEN)

proxyサーバがListenするポート番号を開放します。firewall-cmdの使い方は、firewall-cmdの使い方 - hana_shinのLinux技術ブログを参照してください。

[root@server ~]# firewall-cmd --add-port=8080/tcp
success

ポートの状態を確認します。8080番ポートが解放されたことがわかります。

[root@server ~]# firewall-cmd --list-ports
8080/tcp

6.2 実行結果

クライアントからproxyサーバ経由で東京都のHPにアクセスしてみます。

[root@client ~]# curl -x http://192.168.122.216:8080 https://www.metro.tokyo.lg.jp/
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Style-Type" content="text/css">
<meta http-equiv="Content-Script-Type" content="text/javascript">

<title>東京都公式ホームページ</title>
-snip-

7 GET,POST,PUT,DELETEの使い方

7.1 事前準備

サーバにHTTPサーバ(json-server)をインストールします。

[root@server ~]# yum -y install npm
[root@server ~]# npm install -g json-server
[root@server ~]# json-server -v
0.17.0

id,ベンダー、PCを組みにしたデータを作成します。

[root@server ~]# vi db.json
[root@server ~]# cat db.json
{
  "pc": [
    { "id": 1, "fujitsu": "fmv" },
    { "id": 2, "nec": "lavie" }
  ]
}

json-serverを起動します。 json-serverの起動ログより、json-serverのは3000番ポートでListenしていることがわかります。

[root@server ~]# json-server -H 192.168.122.216 --watch db.json

  \{^_^}/ hi!

  Loading db.json
  Done

  Resources
  http://192.168.122.216:3000/pc

  Home
  http://192.168.122.216:3000

  Type s + enter at any time to create a snapshot of the database
  Watching...

json-serverは、nodeというプロセス名でTCPの3000番ポートでListenしていることがわかります。

[root@server ~]# lsof -c node -a -i -a -nP
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
node    1233 root   22u  IPv4  21992      0t0  TCP 192.168.122.216:3000 (LISTEN)

TCPの3000番ポートを解放します。

[root@server ~]# firewall-cmd --add-port=3000/tcp
success

ポート番号の状態を確認します。3000番ポートが解放されたことがわかります。

[root@server ~]# firewall-cmd --list-ports
3000/tcp

7.2 GETの使い方

GETメソッドを使ってデータを読み出してみます。

[root@client ~]# curl http://192.168.122.216:3000/pc
[
  {
    "id": 1,
    "fujitsu": "fmv"
  },
  {
    "id": 2,
    "nec": "lavie"
  }
][root@client ~]#

7.3 POSTの使い方(追加)

POSTメソッドを使ってデータを追加してみます。追加データは-dで指定します。

[root@client ~]# curl -X POST http://192.168.122.216:3000/pc -d toshiba=dynabook
{
  "toshiba": "dynabook",
  "id": 3
}[root@client ~]#
[root@client ~]# curl http://192.168.122.216:3000/pc
[
  {
    "id": 1,
    "fujitsu": "fmv"
  },
  {
    "id": 2,
    "nec": "lavie"
  },
  {
    "toshiba": "dynabook",
    "id": 3
  }
][root@client ~]#

7.4 PUTの使い方(更新)

PUTメソッドを使って、fujitsuのPCをfmvからPRIMERGYに更新してみます。更新するデータは-dで指定します

[root@client ~]# curl -X PUT http://192.168.122.216:3000/pc/1 -d fujitsu=PRIMERGY
{
  "fujitsu": "PRIMERGY",
  "id": 1

更新したデータを確認します。fujitsuのPCがfmvからPRIMERGYに更新されたことがわかります。

[root@client ~]# curl http://192.168.122.216:3000/pc
[
  {
    "fujitsu": "PRIMERGY",
    "id": 1
  },
  {
    "id": 2,
    "nec": "lavie"
  },
  {
    "toshiba": "dynabook",
    "id": 3
  }
][root@client ~]#

7.5 DELETEの使い方(削除)

DELETEメソッドを使って、idが3のデータをしてみます。更新データは-Xで指定します。

[root@client ~]# curl -X DELETE http://192.168.122.216:3000/pc/3

データを確認します。idが3のデータが削除されたことがわかります。

[root@client ~]# curl http://192.168.122.216:3000/pc
[
  {
    "fujitsu": "PRIMERGY",
    "id": 1
  },
  {
    "id": 2,
    "nec": "lavie"
  }
][root@client ~]#

8 プログレスメータの出力やエラー出力

8.1 出力方法(-#)

[root@server ~]# curl -# -O http://ftp.riken.jp/Linux/centos/7.9.2009/os/x86_64/Packages/bc-1.06.95-13.el7.x86_64.rpm
######################################################################## 100.0%

8.2 抑止方法(-s)

[root@server ~]# curl -s -O http://ftp.riken.jp/Linux/centos/7.9.2009/os/x86_64/Packages/bc-1.06.95-13.el7.x86_64.rpm
[root@server ~]#

9 指定したTLSバージョンでアクセスする方法

TLS1.2でwww.example.comにアクセスしてみます。

[root@server ~]# curl --tlsv1.2 https://www.example.com
<!doctype html>
<html>
<head>
    <title>Example Domain</title>
-snip-

10 ftpサーバのディレクトリリストを取得する方法(-l)

ftpサーバのディレクトリのファイル一覧を表示してみます。

[root@server ~]# curl -l ftp://ftp.riken.go.jp/Linux/ubuntu/
ubuntu
dists
indices
pool
project
ls-lR.gz

Z 参考情報

私が業務や記事執筆で参考にした書籍を以下のページに記載します。
Linux技術のスキルアップをしよう! - hana_shinのLinux技術ブログ