cURLでこういうときはどうする?

# <b>はじめに</b>

Linuxコマンドの中でかなり深い使われ方をするcURLですが、一般的なGET/POSTリクエスト以外にどういったことができるのかと、調べて自分用にまとめたものです。
過去にも１度記事にしています、対応プロトコルが増えていたので、追記ではなく、新規に記事としています、過去の記事はこちら [Curl Ver7.33](https://qiita.com/hirohiro77/items/393e64ea56fed46062f5)
基本的にCentOS7でのcurlコマンドの使い方になりますが、部分的にWindows用とMacOSX用の解説を含んでいます。

# <b>cURLのインストール</b>

オフィシャルサイト
https://curl.haxx.se/

- <b>Linux版について</b>

大体のLinuxディストリでは標準で入っています、が、バージョンが古いことが多いです。
現状の最新は7.60.0(2018/06/16現在)です。

有名ディストリの標準バージョンですが以下のようになっています
※ディストリビューションの互換については、後述するパッケージをとってきてインストールする場合に使えるかどうかの判断用です。

|ディストリ|ディストリVer|cURL Ver|ディストリ互換|
|---|---|---|---|
|CentOS|6.9|7.19.7|Fedora 12,13 |
|CentOS|7.5.1804|7.29.0|Fedora 19,20|
|Fedora|28|7.59.0|Non|
|Debian|7.11,wheezy|7.26.0|Non|
|Debian|8.10,jessie|7.38.0|Non|
|Debian|9.4,stretch|7.52.1|Non|
|Ubuntu|16.04.4 LTS (Xenial Xerus)|7.47.0|Debian jessie,stretch|
|Ubuntu|17.10.1 (Artful Aardvark)|7.55.1|Debian jessie,stretch|
|Ubuntu|18.04 LTS (Bionic Beaver)|7.60.0|Debian jessie,stretch|
|Ubuntu|18.10 (Cosmic Cuttlefish)|7.60.0|Debian stretch,buster|

まあ見てわかる通り、Ububtu以外は最新に追従してません。
といっても、大体の場合、WEBアクセスのクライアントとしてしか使わないことが多いので、Ver 7.30以上あればいいのですけど。
そういう意味だと、CentOSは7でもちょっとCurlは心もとないです。

- <b>Windows版について</b>

Windowsに至っては標準コマンドとして入っていません

導入する場合は、MinGW版が良いです、ProviderがViktor Szakatsのものを選びましょう
※ほかのProviderでもいいのですが、Cygwinベースのものがありますので、ファイルの保存先を指定する場合
/cygdrive/(ドライブレター)/(パス名)/、といった特殊なプレフィクスがついてしまう点に注意が必要です

https://bintray.com/vszakats/generic/curl/7.60.0

- <b>Mac版について</b>

一応、Macにも標準で入っているのですが、Derwin(UNIX)のものなので、オプションや挙動が少し違います
※入っているバージョンについては以下のようになっているようです、アップデートの挙動で変わってしまうので、
多少、マイナーバージョンが前後しますが、大体の目安に

|Mac OS X Ver|cURL Ver|
|---|---|
|10.6|7.19|
|10.7|7.22|
|10.8|7.23|
|10.9|7.24|
|10.10|7.30|
|10.11|7.37|
|10.12|7.49|
|10.13|7.51|

<font color="red">10.12(sierra)以降については、Homebrewでcurl 7.60までアップデートできます</font>

- <b>cURLの実行時の設定について</b>

基本は、ユーザのホームパス以下に.curlrcという設定が生成され、それを見に行きます。
デフォルトだと、中身の入っていないファイルができます。
以下のような設定をすることができます、コメントに入れていますが、cURLのバージョンで使えないものがありますので注意してください
コメントで###がついているものは、概要・説明等、#が1つだけのものはひな型用にコメントアウトしたものです


```.curlrc

### HTTP-Version [curl Ver >= 7.19.2]
http1.0
#http1.1
#http2

# IPv4/IPv6のどちらで名前解決を行うか:[curl Ver >= 7.37.0]
ipv4
#ipv6

### HTTP PROXYの利用:[curl Ver >= 7.19.2]
proxy-user = "(ユーザ名):(パスワード)"
proxy = "http://(アドレス):(ポート)"

### Socks5 PROXYの利用:[curl Ver >= 7.21.7]
proxy-user = "(ユーザ名):(パスワード)"
proxy = "socks5://(アドレス):(ポート)"

### WEBアクセス時のUser-Agentの設定 [curl Ver >= 7.19.2]
### Sony Xperia XZ
#user-agent = "Mozilla/5.0 (Linux; Android 7.1.1; G8231 Build/41.2.A.0.219; wv)" 
### Mac OS X 10.13 Safari
#user-agent = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13) AppleWebKit/604.1.31 (KHTML, like Gecko) Version/11.0 Safari/604.1.31"
### Windows10 Firefox
#user-agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:58.0) Gecko/20100101 Firefox/58.0"
### Windows10 Chrome
user-agent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.87 Safari/537.36"

### Referer の設定
referer = ";auto"

### .netrc の利用可否
#netrc
#netrc-optional

### キープアライブ(秒)
connect-timeout = 300
speed-time      = 120
speed-limit     = 9000000

### 切断時の自動リトライ数
retry           = 4
retry-delay     = 5
retry-max-time  = 10

### ファイルアップロード時の改行コード変換
#crlf

### FTPコマンド利用時の設定
ftp-create-dirs
ftp-ssl
ftp-pasv
ftp-method = nocwd

### SSL 証明書
### 古いとError (35)がでる、以下のコマンドで最新にする
### curl http://curl.haxx.se/ca/cacert.pem -o /usr/ssl/certs/ca-bundle.crt
### cURLがNSSの場合は書き方が違うので注意、以下はOpenSSLの場合
cacert = /usr/ssl/certs/ca-bundle.crt
capath = /usr/ssl/certs/
### NSSの場合は
### mk-ca-bundle.pl というコマンドがいるはずなので、これを実行すると
### sql:/etc/pki/nssdb が更新される

### SSLの挙動を抑制する [OpenSSL >= 1.0.0 or NSS >= 3.19.1-6]
#insecure
tlsv1
#tlsv1.0
#tlsv1.1
#tlsv1.2
#sslv2
#sslv3

### cookieの利用時の保存パス
cookie-jar = /tmp/.curl_cookies
cookie = /tmp/.curl_cookies

```

# <b>cURLの使い方</b>

コンソールにWEBソースを表示

```
curl [URL]
```

WEBのデータをローカルに保存

```
curl -O [URL] -o [ファイル名(省略するとWEBのファイル名になる)]
```

WEBのデータを分割ダウンロード

```
curl -o one.html http://example.com/1 http://example.com/2
```

Name Virtual HostにHOSTSを書き換えずに直接アクセス

```
curl -H "Host: www.example.com" http://localhost/
```

cURLだけで逆引き指定してアクセス

```
curl --resolve example.com:80:127.0.0.1 http://example.com/
```

NIC(インターフェース)指定でアクセスする

```
curl --interface eth1 https://www.example.com/
```

PASVなどのポート範囲指定のアクセス

```
curl --local-port 4000-4200 https://example.com/
```

キープアライブ指定

```
curl --no-keepalive https://example.com/
curl --keepalive-time 300 https://example.com/
```

リダイレクト対応しダウンロードを実施

```
curl -L -O [URL]
```

HTTPヘッダの確認

```
curl -I -s [URL]
```

UserAgent指定

```
curl -A 'CURL WEB CLI' example.com
```

リファラ指定

```
curl -e http://example.com/ http://example.com/targetfile
```

Cookieを利用

```
curl -b example.cookie http://example.com/
```

POSTデータをurlエンコードして送信

```
curl -d user=hoge --data-urlencode pass='pass&word' http://example.com/
```

FileをPOSTする場合

```
curl -F "web=@index.html;type=text/html" url.example.com
```



SCP/SFTP Download

```
curl -u [USER]:[PASSWORD] scp://example.com/file.zip
curl -u [USER]:[PASSWORD] sftp://example.com/file.zip
```

SCP/SFTP upload

```
curl -T [FILENAME] -u [USER]:[PASSWORD] scp://example.com/UPLOAD_PATH/FILENAME
curl -T [FILENAME] -u [USER]:[PASSWORD] sftp://example.com/UPLOAD_PATH
```

FTP Upload

```
curl -T [FILENAME] -u [USER]:[PASSWORD] --ftp-create-dirs -ssl ftp://HOSTNAME/UPLOAD_PATH
```

FTP Download

```
curl -u [USER]:[PASSWORD] -O ftp://HOSTNAME/PATH/FILENAME
```

FTP LIST

```
curl -u [USER]:[PASSWORD] ftp://[HOSTNAME]/[PATH]/
```

Samba Upload

```
curl -T [FILENAME] -u "domain\username:passwd" smb://HOSTNAME/PATH/
```

Samba Download

```
curl -u "domain\username:passwd" smb://HOSTNAME/PATH/FILENAME
```

SMTP(s)  メール送信

```
curl smtp://example.com --mail-from 'from@example.com' --mail-rcpt 'to@example.com' -u 'username:password'  -T \
"From: 'xxxxx'
To: 'xxxxx'
Subject: [SUBJECT]

TEST
"
```

POP3(s) メールボックス確認

```
curl -u 'username:password' pop3://mail.example.com/
```

POP3(s) メールを読む

```
curl -u 'username:password' pop3://mail.example.com/[MAIL No]
```

POP3(s) メールを消す

```
curl -u 'username:password' --request DELE pop3://mail.example.com/[MAIL No]
```

IMAP(s) メールボックス確認

```
curl -u 'username:password' --url 'imaps://imap.gmail.com:993' -X 'EXAMINE INBOX'
```

IMAP(s) 一覧取得

```
curl -u 'username:password' --url 'imaps://imap.gmail.com:993/INBOX;'
```

IMAP(s) 未読/既読一覧取得

```
curl -u 'username:password' --url 'imaps://imap.gmail.com:993/INBOX' -X 'SEARCH UNSEEN'
curl -u 'username:password' --url 'imaps://imap.gmail.com:993/INBOX' -X 'SEARCH SEEN'
```

IMAP(s) メールを読む

```
curl -u 'username:password' --url 'imaps://imap.gmail.com:993/INBOX;UID=(読みたいメールのUID);SECTION=TEXT' | nkf
```

IMAP(s) 削除フラグ

```
curl -u 'username:password' --url 'imaps://imap.gmail.com:993/INBOX' -X "STORE (メールのUID) +Flags \Deleted"
```

IMAP(s) 未読化(-Flags \Seen)/既読化(+Flags \Seen)

```
curl -u 'username:password' --url 'imaps://imap.gmail.com:993/INBOX' -X "STORE (メールのUID) -Flags \Seen"
curl -u 'username:password' --url 'imaps://imap.gmail.com:993/INBOX' -X "STORE (メールのUID) +Flags \Seen"
```

TELNETする

```
curl -vv telnet://xxx.xxx.xxx.xxx:23
```

ストリームダウンロード

```
curl -o sample.mp4 rtmp://live.example.com/live/sample.mp4
```



LDAP関連、RTSP関連はまた後日追加します。