cURL 是一個(gè)軟件包慨亲,由命令行工具和庫組成,用于使用 URL 語法進(jìn)行數(shù)據(jù)傳輸狰贯。
cURL 支持各種協(xié)議也搓,如:
DICT
FILE
FTP
FTPS
Gopher
HTTP
HTTPS
IMAP
IMAPS
LDAP
LDAPS
POP3
POP3S
RTMP
RTSP
SCP
SFTP
SMTP
SMTPS
Telnet
TFTP
〇、涉及到的命令
行為 ****************************************************************
--data-ascii <data>
-d, --data <data> .................................. POST 數(shù)據(jù)
--data-binary .................................. 同 -d涵紊,但不對(duì)數(shù)據(jù)做字符轉(zhuǎn)換傍妒,@ 指定文件名
--data-raw <data> .............................. 同 -d,@ 按普通字符對(duì)待摸柄,后續(xù)內(nèi)容不按文件名處理
--data-urlencode <data> ........................ POST 數(shù)據(jù)(明確指定需要進(jìn)行 URLEncode颤练,參數(shù)中有敏感字符需要這樣使用)
-F, --form <name=content> .......................... POST 數(shù)據(jù),表單提交
-G, --get .......................................... 將參數(shù)以 GET 方式請(qǐng)求
-I, --head ......................................... 相當(dāng)于 HTTP HEAD 方法
-o, --output <file> ................................ 下載到指定文件名
-O, --remote-name .................................. 下載到默認(rèn)文件名驱负,默認(rèn)從 URL 中提取文件名
-J, --remote-header-name ........................... 告訴 -O 選項(xiàng)使用服務(wù)器指定的 Content-Disposition 文件名
-X, --request <command> ............................ 指定請(qǐng)求方法(GET/POST/PUT/DELETE等嗦玖,根據(jù)協(xié)議而定)
傳輸控制 *************************************************************
-C, --continue-at <offset> ......................... 斷點(diǎn)續(xù)傳
--limit-rate <speed> ........................... 限速
-L, --location ..................................... 遵循 302 跳轉(zhuǎn)
-r, --range <range> ................................ 指定下載內(nèi)容字節(jié)范圍
-z, --time-cond <time> ............................. 根據(jù)指定日期下載
輸出 ****************************************************************
-#, --progress-bar ................................. 進(jìn)度條
-f, --fail ......................................... HTTP 服務(wù)能夠連接患雇,但返回非正常狀態(tài)碼時(shí)(如:40x),表現(xiàn)為命令失敗踏揣,并不返回?cái)?shù)據(jù)
-i, --include ...................................... 輸出信息中包括 Response 頭信息
-s, --silent ....................................... 靜默模式庆亡,不顯示進(jìn)度
-S, --show-error ................................... 靜默模式但顯示錯(cuò)誤
--trace <file>
--trace-ascii <file>
--trace-time ................................... 訪問的詳細(xì)過程
-v, --verbose ...................................... 開啟 verbose 模式,打印詳情
-w, --write-out <format> ........................... 傳輸完成后顯示傳輸信息
網(wǎng)絡(luò) ****************************************************************
--connect-timeout <seconds> .................... 連接允許的最長時(shí)間(連接服務(wù)器時(shí)間長時(shí)使用)
--local-port <num/range> ....................... 本地端口
-m, --max-time <seconds> ........................... 傳輸允許的最長時(shí)間(服務(wù)器數(shù)據(jù)處理時(shí)間長時(shí)使用)
-x, --proxy [protocol://]host[:port] ............... 使用代理服務(wù)器
--resolve <[+]host:port:addr[,addr]...> ........ 自定義域名解析
請(qǐng)求頭 ****************************************************************
-A, --user-agent <name> ............................ 指定 User-Agent
-b, --cookie <data|filename>........................ 使用指定 Cookie 或文件中的內(nèi)容作為 Cookie 信息
-c, --cookie-jar <filename> ........................ 將 Cookie 保存到文件
-e, --referer <URL> ................................ 指定 Referer
-H, --header <header/@file> ........................ 指定 Header
--oauth2-bearer <token> ........................ OAuth 2 Bearer Token
-u, --user <user:password> ......................... HTTP 認(rèn)證捞稿,默認(rèn)為 Basic Auth
證書 ****************************************************************
--cacert <file> ................................ 指定 CA 證書用于校驗(yàn)服務(wù)器
-E, --cert <certificate[:password]> ................ 雙向認(rèn)證時(shí)指定客戶端證書和密碼
--cert-type <type> ............................. 證書文件類型(DER/PEM/ENG)
-k, --insecure ..................................... 允許使用不安全證書
協(xié)議 ****************************************************************
--mail-from又谋、--mail-rcpt <address> ............. 使用 SMTP 協(xié)議發(fā)送郵件
-T, --upload-file <file> ........................... 上傳 FTP
一、HTTP 協(xié)議
(一)常用
1娱局、下載單個(gè)文件
從 URL 獲取內(nèi)容彰亥,并顯示到 STDOUT(如:控制臺(tái))
$ curl http://www.centos.org
要輸出到一個(gè)文件,可以通過重定向的方法衰齐。這種方法同時(shí)也會(huì)顯示一些額外的下載狀態(tài)任斋。
$ curl http://www.centos.org > centos-org.html
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 27329 0 27329 0 0 104k 0 --:--:-- --:--:-- --:--:-- 167k
2、cURL 輸出到文件(-O
/ -o
)
使用 -o
或 -O
選項(xiàng)
-
-o
(小寫)輸出到命令行中提供的文件名 -
-O
(大寫)輸出到 URL 中帶的文件名
例如:
$ curl -o mygettext.html http://www.gnu.org/software/gettext/manual/gettext.html
這樣的話耻涛,內(nèi)容會(huì)被保存到 mygettext.html
中废酷。同時(shí)也會(huì)看到,使用 -o
參數(shù)抹缕,也會(huì)像下面這樣顯示下載進(jìn)度:
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
66 1215k 66 805k 0 0 33060 0 0:00:37 0:00:24 0:00:13 45900
100 1215k 100 1215k 0 0 39474 0 0:00:31 0:00:31 --:--:-- 68987
當(dāng)使用 -O(大寫)
參數(shù)時(shí)澈蟆,會(huì)保存到 gettext.html
中。
$ curl -O http://www.gnu.org/software/gettext/manual/gettext.html
注意:當(dāng) cURL 將內(nèi)容輸出到控制臺(tái)時(shí)卓研,不會(huì)顯示下載進(jìn)度趴俘,以避免顯示內(nèi)容的混亂∽嘧福可以使用 >
-o
-O
來將結(jié)果輸出到文件支子。
與使用 cURL 一樣恼五,也可以使用 wget 下載文件邪铲,具體使用方法參考 Wget Examples
3望拖、一次性獲取多個(gè)文件(-O
)
語法:
$ curl -O URL1 -O URL2
下面的命令行,可以同時(shí)下載 index.html
和 gettext.html
到當(dāng)前目錄梁只。
$ curl -O http://www.gnu.org/software/gettext/manual/html_node/index.html -O http://www.gnu.org/software/gettext/manual/gettext.html
如果像上面這樣缚柳,從同一個(gè)服務(wù)器下載多個(gè)文件,cURL 會(huì)嘗試重用連接
4敛纲、遵從 HTTP Location 頭信息做跳轉(zhuǎn)(-L
)
默認(rèn)情況喂击,cURL 不會(huì)根據(jù) HTTP 的 Location 頭(稱為 重定向)剂癌。當(dāng)請(qǐng)求的 Web 內(nèi)容移動(dòng)到了其他的位置淤翔,HTTP Location 頭會(huì)作為 Response 的一部分返回,并且指明實(shí)際的位置佩谷。
例如:當(dāng)有人在印度使用瀏覽器訪問 google.com
旁壮,會(huì)被自動(dòng)重定向到 google.co.in
监嗜。這是基于以下的 HTTP Location 頭來完成的:
$ curl http://www.google.com
<TITLE>302 Moved</TITLE>
<H1>302 Moved</H1>
The document has moved
<A >here</A>
這一段內(nèi)容,說明請(qǐng)求的內(nèi)容抡谐,已經(jīng)被移動(dòng)到了 http://www.google.co.in
裁奇。
如果想使用 cURL 也完成這樣的跳轉(zhuǎn),可以使用 -L
選項(xiàng)麦撵。
$ curl -L http://www.google.com
5刽肠、使用 cURL 通過 HTTP Authentication(-u
)
有時(shí)候,網(wǎng)站需要 用戶名 和 密碼 認(rèn)證免胃,才能查看文件內(nèi)容音五。也可以使用(.htaccess 文件)「嵘常可以使用 -u
選項(xiàng)躺涝,通過 cURL 把認(rèn)證信息傳到服務(wù)器。如:
$ curl -u username:password URL
注意:默認(rèn)情況下扼雏,cURL 使用 Basic HTTP Authentication坚嗜。可以使用 –ntlm | –digest 選項(xiàng)诗充,指定其他認(rèn)證方式苍蔬。
6、使用代理服務(wù)器(-x
)
通過指定 -x
選項(xiàng)其障,來指定代理服務(wù)器和端口银室。
$ curl -x proxysever.test.com:3128 http://google.co.in
從 7.21.7 開始,可以使用 protocol://
前綴指定代理協(xié)議励翼。 使用 socks4://
蜈敢,socks4a://
,socks5://
或 socks5h://
指定要使用的 SOCKS 版本汽抚。 未指定協(xié)議的話抓狭,http://
和所有其他協(xié)議都將被視為 HTTP 代理。
7造烁、更詳細(xì)的信息(-v
否过,--trace
,--trace-ascii
惭蟋,--trace-time
)
可以使用 -v
選項(xiàng)苗桂,來知道到底發(fā)生了什么。-v
開啟 verbose 模式告组,打印詳情煤伟。
curl -v http://google.co.in
上面的命令輸入如下內(nèi)容:
* About to connect() to www.google.co.in port 80 (#0)
* Trying 74.125.236.56... connected
* Connected to www.google.co.in (74.125.236.56) port 80 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.21.0 (i486-pc-linux-gnu) libcurl/7.21.0 OpenSSL/0.9.8o zlib/1.2.3.4 libidn/1.15 libssh2/1.2.6
> Host: www.google.co.in
> Accept: */*
>
* HTTP 1.0, assume close after body
< HTTP/1.0 200 OK
< Date: Tue, 10 Apr 2012 11:18:39 GMT
< Expires: -1
< Cache-Control: private, max-age=0
< Content-Type: text/html; charset=ISO-8859-1
< Set-Cookie: PREF=ID=7c497a6b15cc092d:FF=0:TM=1334056719:LM=1334056719:S=UORpBwxFmTRkbXLj; expires=Thu, 10-Apr-2014 11:18:39 GMT; path=/; domain=.google.co.in
.
.
如果需要更詳細(xì)的信息,使用 --trace
選項(xiàng)。這里為了演示方便便锨,使用 --trace-ascii
只顯示 ASCII 內(nèi)容围辙,并通過 --trace-time
顯示時(shí)間戳:
# 訪問 httpbin,測(cè)試延遲 3 秒的請(qǐng)求
$ curl --trace-ascii traceinfo.txt --trace-time http://httpbin.org/delay/3
信息會(huì)記錄到指定的 traceinfo.txt
中:(如果傳入 -
則顯示到控制臺(tái))
23:27:00.786693 == Info: Trying 34.193.212.251...
23:27:00.787303 == Info: TCP_NODELAY set
23:27:02.137448 == Info: Connected to httpbin.org (34.193.212.251) port 80 (#0)
23:27:02.137524 => Send header, 82 bytes (0x52)
0000: GET /delay/3 HTTP/1.1
0017: Host: httpbin.org
002a: User-Agent: curl/7.64.1
0043: Accept: */*
0050:
23:27:10.022422 <= Recv header, 17 bytes (0x11)
0000: HTTP/1.1 200 OK
23:27:10.022481 <= Recv header, 40 bytes (0x28)
0000: Access-Control-Allow-Credentials: true
23:27:10.022501 <= Recv header, 32 bytes (0x20)
0000: Access-Control-Allow-Origin: *
23:27:10.022521 <= Recv header, 32 bytes (0x20)
0000: Content-Type: application/json
23:27:10.022538 <= Recv header, 37 bytes (0x25)
0000: Date: Mon, 02 Dec 2019 15:27:04 GMT
23:27:10.022554 <= Recv header, 45 bytes (0x2d)
0000: Referrer-Policy: no-referrer-when-downgrade
23:27:10.022573 <= Recv header, 15 bytes (0xf)
0000: Server: nginx
23:27:10.022588 <= Recv header, 33 bytes (0x21)
0000: X-Content-Type-Options: nosniff
23:27:10.022604 <= Recv header, 23 bytes (0x17)
0000: X-Frame-Options: DENY
23:27:10.022619 <= Recv header, 33 bytes (0x21)
0000: X-XSS-Protection: 1; mode=block
23:27:10.022636 <= Recv header, 21 bytes (0x15)
0000: Content-Length: 254
23:27:10.022651 <= Recv header, 24 bytes (0x18)
0000: Connection: keep-alive
23:27:10.022667 <= Recv header, 2 bytes (0x2)
0000:
23:27:10.022680 <= Recv data, 254 bytes (0xfe)
0000: {. "args": {}, . "data": "", . "files": {}, . "form": {}, .
0040: "headers": {. "Accept": "*/*", . "Host": "httpbin.org", .
0080: "User-Agent": "curl/7.64.1". }, . "origin": "111.30.232.16
00c0: 0, 111.30.232.160", . "url": "https://httpbin.org/delay/3".}.
23:27:10.022766 == Info: Connection #0 to host httpbin.org left intact
verbose 和 trace 選項(xiàng)放案,可以在 cURL 發(fā)生未知原因失敗時(shí)使用姚建。
8、傳輸完成后顯示傳輸信息(-w
)
curl -o /dev/null -s -w \
'http_code: %{http_code}
http_connect: %{http_connect}
content_type: %{content_type}
time_appconnect: %{time_appconnect}
time_connect: %{time_connect}
time_namelookup: %{time_namelookup}
time_pretransfer: %{time_pretransfer}
time_redirect: %{time_redirect}
time_starttransfer: %{time_starttransfer}
time_total: %{time_total}
speed_download: %{speed_download}' http://httpbin.org/delay/3
執(zhí)行結(jié)果:
http_code: 200
http_connect: 000
content_type: application/json
time_appconnect: 0.000000
time_connect: 1.324640
time_namelookup: 0.023474
time_pretransfer: 1.324761
time_redirect: 0.000000
time_starttransfer: 5.444911
time_total: 5.445035
speed_download: 46.000
9吱殉、自定義域名解析(--resolve
)
對(duì)于不具備自定義域名解析能力的場(chǎng)景掸冤,如:
- 無法自定義 DNS
- 無法修改
/etc/hosts
表
恰巧 HTTP 服務(wù)器有配置了虛擬主機(jī),需要通過 server_name
來進(jìn)行 SNI友雳,就需要自定義域名解析能力了贩虾。
(1)場(chǎng)景一:通過 IP 訪問 做了虛擬主機(jī)配置的 HTTP 服務(wù)
假設(shè)服務(wù)器 IP 為:1.2.3.4
但配置了多個(gè)虛擬主機(jī),我們需要訪問:your-server.net
$ curl 'http://1.2.3.4' -H 'Host: your-server.net'
(2)場(chǎng)景二:通過 IP 訪問 做了虛擬主機(jī)配置的 HTTPS 服務(wù)
由于 HTTPS 服務(wù)需要驗(yàn)證訪問的域名與證書的匹配性沥阱,所以無法通過前面通過制定 Host
頭的方式進(jìn)行處理缎罢。
這里需要使用 --resolve
參數(shù):
$ curl 'https://your-server.net' --resolve 'your-server.net:443:1.2.3.4'
可以將這種方式視為命令行上提供的一種 /etc/hosts
替代方案。這種方式支持域名的通配符考杉,也可以支持多個(gè) IP 地址策精。
(二)輔助
1、繼續(xù)/恢復(fù) 之前的下載(-C
)
使用 cURL 的 -C
選項(xiàng)崇棠,可以繼續(xù)之前停止的下載咽袜。這對(duì)于下載大文件,或下載被打斷的情況很有幫助枕稀。
如果使用了 -C -
询刹,也就是 -C
后面加空格,再跟個(gè) -
萎坷,cURL 會(huì)自動(dòng)找到從哪里開始繼續(xù)下載凹联。
我們也可以使用 -C <offset>
,指定位移字節(jié)數(shù)哆档,這樣的話蔽挠,會(huì)從源文件頭跳過這些字節(jié)數(shù)后,再開始下載瓜浸。
使用 cURL 下載一個(gè)大文件澳淑,使用 Ctrl+C
,停止:
$ curl -O http://www.gnu.org/software/gettext/manual/gettext.html
############## 20.1%
注意:-#
用于顯示一個(gè)進(jìn)度條插佛,而不是一個(gè)進(jìn)度表杠巡。
現(xiàn)在下載已經(jīng)停止在 20.1%,現(xiàn)在可以使用 -C -
來繼續(xù)后面的下載雇寇。
2氢拥、限定傳輸速率(--limit-rate
)
可以使用 --limit-rate
選項(xiàng)绑改,指定最大傳輸速率。
$ curl --limit-rate 1000B -O http://www.gnu.org/software/gettext/manual/gettext.html
上面的命令行兄一,限定數(shù)據(jù)傳輸速率為 1000Byte/second
。cURL 有可能會(huì)階段性使用更高的速率识腿,但是平均值會(huì)在 1000Byte/second
出革。
下面是剛才命令行執(zhí)行時(shí)的進(jìn)度表,可以看到渡讼,速度是接近 1000 Bytes
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
1 1215k 1 13601 0 0 957 0 0:21:40 0:00:14 0:21:26 999
1 1215k 1 14601 0 0 960 0 0:21:36 0:00:15 0:21:21 999
1 1215k 1 15601 0 0 962 0 0:21:34 0:00:16 0:21:18 999
3骂束、判定在指定日期 之前/之后 修改過,才下載文件(-z
)
可以在 cURL 的命令行中成箫,使用 -z
選項(xiàng)展箱,來獲取指定日期之后修改過的文件。這個(gè)選項(xiàng)對(duì)于 HTTP 和 FTP 都有效蹬昌。
$ curl -z 21-Dec-11 http://www.example.com/yy.html
上面的命令混驰,只在 yy.html 在指定日期之后修改過,才會(huì)下載皂贩。
$ curl -z -21-Dec-11 http://www.example.com/yy.html
上面的命令栖榨,只在 yy.html 在指定日期之前修改過,才會(huì)下載明刷。注意日期前面的 -
婴栽。
請(qǐng)參考 man curl_getdate
獲取各種日期表達(dá)式支持。
4辈末、使用范圍進(jìn)行列表愚争、下載
$ curl ftp://ftp.uk.debian.org/debian/pool/main/[a-z]/
對(duì) HTTP 協(xié)議也是一樣的。
二挤聘、其它協(xié)議
1轰枝、從 FTP 服務(wù)器下載文件
cURL 也可以從 FTP 服務(wù)器下載文件。如果給定的 FTP 路徑是個(gè)目錄组去,默認(rèn)會(huì)列出此目錄下的所有文件狸膏。
$ curl -u ftpuser:ftppass -O ftp://ftp_server/public_html/xss.php
上面的命令,下載了 xss.php添怔。
$ curl -u ftpuser:ftppass -O ftp://ftp_server/public_html/
這是列表的情況湾戳。
FTP/SFTP 新手,參考 FTP SFTP Tutorial for Beginners
2广料、將文件上傳到 FTP 服務(wù)器(-T
)
cURL 可以使用 -T 選項(xiàng)砾脑。
$ curl -u ftpuser:ftppass -T myfile.txt ftp://ftp.testserver.com
上面的命令,將 myfile.txt 上傳到 FTP 服務(wù)器艾杏。也可以使用 range 選項(xiàng)韧衣,一次性上傳多個(gè)文件。
$ curl -u ftpuser:ftppass -T "{file1,file2}" ftp://ftp.testserver.com
也可以使用 -
來獲取 STDIN 輸入,并傳輸?shù)椒?wù)器畅铭。
$ curl -u ftpuser:ftppass -T - ftp://ftp.testserver.com/myfile_1.txt
上面的命令氏淑,獲取 STDIN 的輸入,并將內(nèi)容保存到 myfile_1.txt硕噩。
可以為每個(gè) URL 提供一個(gè) -T 參數(shù)假残,指定每個(gè)上傳的位置。
3炉擅、使用 SMTP 協(xié)議發(fā)送郵件(--mail-from
辉懒、--mail-rcpt
)
$ curl --mail-from blah@test.com --mail-rcpt foo@test.com smtp://mailserver.com
上面的命令行輸入后,會(huì)等待用戶輸入數(shù)據(jù)谍失。輸入內(nèi)容后眶俩,鍵入 .
作為最后一行,然后郵件會(huì)被立即發(fā)送快鱼。
4颠印、使用 POP3 協(xié)議收取郵件
$ curl pop3://username:password@mail.server/INBOX mailindex(整數(shù))
5、使用 IMAP 協(xié)議收取郵件
$ curl --url "imap://mail.example.com/" --user "user:password"
$ curl --insecure --url "imaps://mail.example.com/" --user "user:password"
Performing IMAP queries via curl
三抹竹、參考鏈接
- 15 Practical Linux cURL Command Examples (cURL Download Examples)
- Using curl to automate HTTP jobs
- cURL常用命令
- cURL命令詳解
- curl 常用參數(shù)總結(jié)
- CURL常用命令
(完)