[TOC]
簡(jiǎn)介
curl is a tool to transfer data from or to a server, using one of the supported protocols (DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, TELNET and TFTP). The command is designed to work without user interaction.
curl 是一個(gè)命令行客戶端,支持多種傳輸協(xié)議聊记,最經(jīng)常使用的場(chǎng)景就是在終端請(qǐng)求服務(wù)器資源震桶。
curl 命令非常強(qiáng)大逆屡,熟練掌握情況下很魂,相當(dāng)于一個(gè)微型終端瀏覽器柔袁。
基本使用
-
請(qǐng)求資源:curl 直接使用的效果就是發(fā)送
Get
請(qǐng)求服務(wù)器資源:$ curl 'http://httpbin.org/get'
-
指定請(qǐng)求方法:使用選項(xiàng)
-X, --request <command>
:$ curl -X GET 'http://httpbin.org/get' # 默認(rèn)即使用 GET 請(qǐng)求鞠绰,故可忽略 -X GET $ curl -X POST 'http://httpbin.org/post' # 發(fā)送 POST 請(qǐng)求
該選項(xiàng)的參數(shù)有:
GET
厢洞、POST
绳锅、HEAD
西饵、PUT
、DELETE
鳞芙、FTP
眷柔、POP3
、IMAP
原朝、SMTP
...注:一般情況下驯嘱,
-X
/--request
選項(xiàng)都無(wú)需攜帶,因?yàn)楹芏嗥渌x項(xiàng)都默認(rèn)帶有請(qǐng)求方法的語(yǔ)義喳坠。雖如此鞠评,但還是推薦請(qǐng)求時(shí)攜帶該選項(xiàng)。 -
發(fā)送請(qǐng)求頭:使用選項(xiàng)
-H, --header <header/@file>
:# 發(fā)送請(qǐng)求頭:accept: application/json $ curl -X GET 'http://httpbin.org/headers' -H 'accept: application/json' # 發(fā)送 JSON 數(shù)據(jù) $ curl -X POST -d '{"login": "emma","password": 123}' -H 'Content-Type: application/json' 'http://httpbin.org/post'
-
重定向:使用選項(xiàng)
-L, --location
:# curl 默認(rèn)不會(huì)自動(dòng)重定向 $ curl -X GET "http://httpbin.org/absolute-redirect/1" -H "accept: text/html" # 使用 -L 選項(xiàng)使能重定向 $ curl -X GET "http://httpbin.org/absolute-redirect/1" -H "accept: text/html" -L
-
使用 cookie:使用選項(xiàng)
-b, --cookie <data|filename>
丙笋、-c, --cookie-jar <filename>
:# 請(qǐng)求頭攜帶:Cookie: key1=value1;key2=value2 $ curl 'http://httpbin.org/cookies' -b 'key1=value1;key2=value2' # 保存 Cookie: name=whyn 到文件 cookies.txt $ curl 'http://httpbin.org/cookies/set/name/whyn' -c cookies.txt # 從文件中讀取 Cookie 信息 $ curl 'http://httpbin.org/cookies' -b cookies.txt
-
指定 Referer:使用選項(xiàng)
-e, --referer <URL>
:# 請(qǐng)求頭添加:Referer: http://www.baidu.com $ curl 'http://httpbin.org/get' -e 'http://www.baidu.com' # 當(dāng)然同樣可以直接指定請(qǐng)求頭:Referer $ curl 'http://httpbin.org/get' -H 'Referer: http://www.baidu.com' # 重定向時(shí)谢澈,加上 ;auto,則會(huì)自動(dòng)將第二次請(qǐng)求的 Referer 設(shè)置為重定向頁(yè)面御板,即: # 首次請(qǐng)求:Referer: http://www.baidu.com # 第二次請(qǐng)求(重定向):Referer: http://httpbin.org/redirect/1 $ curl -L 'http://httpbin.org/redirect/1' -e 'http://www.baidu.com;auto'
-
指定 User-Agent:使用選項(xiàng)
-A, --user-agent <name>
:# 添加請(qǐng)求頭:User-Agent: xxxx $ curl 'http://httpbin.org/get' -A 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36' # 當(dāng)然同樣可以直接指定請(qǐng)求頭:User-Agent $ curl 'http://httpbin.org/get' -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.138 Safari/537.36'
-
忽略 SSL 檢測(cè):使用選項(xiàng)
-k, --insecure
:# 跳過(guò) www.baidu.com 的證書(shū)驗(yàn)證 $ curl -k 'https://www.baidu.com'
-
保存為文件:使用選項(xiàng)
-O, --remote-name
锥忿、-o, --output <file>
:# 保存網(wǎng)頁(yè),自動(dòng)命名為 index.html $ curl -O 'http://www.baidu.com/index.html' # 保存網(wǎng)頁(yè)怠肋,手動(dòng)命名為 baidu.html $ curl -o 'baidu.html' 'http://www.baidu.com/index.html' # 下載圖片 $ curl -X GET 'https://upload-images.jianshu.io/upload_images/2222997-88ad51461e1e15ba.png?imageMogr2/auto-orient/strip|imageView2/2/w/1200/format/webp' -o nginx.webp # 自動(dòng)斷點(diǎn)續(xù)傳敬鬓,注: -C - 后面帶一個(gè) -,表示自動(dòng)續(xù)傳,否則需要手動(dòng)指定斷點(diǎn)續(xù)傳字節(jié)位置 $ curl -X GET -C - 'https://upload-images.jianshu.io/upload_images/2222997-88ad51461e1e15ba.png?imageMogr2/auto-orient/strip|imageView2/2/w/1200/format/webp' -o nginx.webp url
注:
-O
/-o
選項(xiàng)將 curl 結(jié)果重定向到文件钉答,相當(dāng)于下載資源础芍,其效果等同于wget
。 -
查看完整請(qǐng)求信息:使用選項(xiàng)
-v, --verbose
:$ curl 'http:/httpbin.org/get' -v
注:
-v
/--verbose
選項(xiàng)會(huì)顯示完整的請(qǐng)求通訊過(guò)程数尿,其顯示內(nèi)容包含如下幾方面:- 以
*
開(kāi)頭的行:表示 curl 提供的額外信息 - 以
>
開(kāi)頭的行:表示 請(qǐng)求頭 內(nèi)容 - 以
<
開(kāi)頭的行:表示響應(yīng)頭內(nèi)容
- 以
其它選項(xiàng)
-
查看響應(yīng)頭:使用選項(xiàng)
-I, --head
:# 相當(dāng)于 head 請(qǐng)求 $ curl 'http://httpbin.org/get' -I
-
查看響應(yīng)頭及響應(yīng)體:使用選項(xiàng)
-i, --include
:$ curl 'http://httpbin.org/get' -i
-
發(fā)送表單數(shù)據(jù):對(duì)應(yīng)選項(xiàng)有如下幾個(gè):
-
-d, --data <data>
:以ContentType:application/x-www-form-urlencoded
的格式發(fā)送表單數(shù)據(jù)仑性,即key1=value1&key2=value2
形式:
# -d 默認(rèn)攜帶 POST 請(qǐng)求語(yǔ)義,故 -X POST 在此可省略 $ curl -X POST -d 'login=emma&password=123' 'http://httpbin.org/post' # 可多次使用 -d右蹦,數(shù)據(jù)會(huì)自動(dòng)合并诊杆,相當(dāng)于`login=emma&password=123` $ curl -X POST -d 'login=emma' -d 'password=123' 'http://httpbin.org/post' $ curl -X POST -d "login=@name.txt" -d "password=-"
注:對(duì)于
GET
請(qǐng)求的參數(shù),有如下兩種格式:# 直接拼接到 URL 后面作為參數(shù)傳遞 $ curl 'http://httpbin.org/anything?name=whyn' # 使用 -d 選項(xiàng)時(shí)何陆,需加上 -G 選項(xiàng)將請(qǐng)求方式設(shè)置為 GET # curl 'http://httpbin.org/anything' -G -d 'name=whyn'
-
--data-urlencode <data>
:如果表單數(shù)據(jù)需要進(jìn)行 URL 編碼晨汹,則使用該選項(xiàng):
$ curl -X POST --data-urlencode 'name=emma wild' 'http://httpbin.org/post'
-
-F, --form <name=content>
:以ContentType: multipart/form-data
的格式發(fā)送表單數(shù)據(jù),一般用于上傳文件:
# 以文件表單進(jìn)行上傳:發(fā)送文件 portrait.png贷盲,對(duì)應(yīng)表單字段為 profile( @ 用于指定上傳文件) $ curl -F profile=@portrait.jpg https://example.com/upload.cgi # 以文本表單進(jìn)行上傳:先讀取 hugefile.txt 內(nèi)容淘这,然后作為字段 story 進(jìn)行上傳( < 表示讀取文件內(nèi)容) $ curl -F "story=<hugefile.txt" https://example.com/ # 從標(biāo)準(zhǔn)輸入流中讀取內(nèi)容進(jìn)行上傳(- 表示讀取標(biāo)準(zhǔn)輸入流,此時(shí)使用 @ 或 < 均可以) $ echo 'Whyn' | curl -X POST -F "name=@-" 'http://httpbin.org/post' # 發(fā)送表單字段 name 和文件 profile巩剖,多字段铝穷,會(huì)產(chǎn)生格式: boundary=------------------------d74496d66958873e $ curl -F name=yourname -F profile=@portrait.jpg https://example.com/upload.cgi # 使用 type 指定上傳文件 MIME 類型,默認(rèn)使用的 MIME 為:application/octet-stream $ curl -F "web=@index.html;type=text/html" example.com # 使用 filename 修改上傳文件名球及,本地使用文件 portrait.jpg氧骤,服務(wù)器接受到的為 me.jgp $ curl -F 'profile=@portrait.jpg;filename=me.jpg' https://example.com/upload.cgi
-
-
代理:使用選項(xiàng)
-x, --proxy [protocol://]host[:port]
# 使用 HTTP 代理(本地使用 Nginx 搭建一個(gè)正向代理,通過(guò) -I 選項(xiàng)可以看到響應(yīng)頭`Server: nginx/1.18.0`吃引,結(jié)果由 Nginx 返回筹陵,則表示代理成功) $ curl -x 'http://localhost:80' 'http://httpbin.org/get' -I # 使用 socks5 代理 $ curl -x "socks5://localhost:10808" "https://www.google.com"
注:
-x, --proxy
選項(xiàng)默認(rèn)使用 HTTP 協(xié)議,默認(rèn)使用端口 1080镊尺。 -
限速:使用選項(xiàng):
--limit-rate <speed>
:# 帶寬限制為 200k $ curl --limit-rate 200k http://www.badiu.com
-
保存詳細(xì)的通訊流程:使用選項(xiàng)
--trace <file>
朦佩,--trace-ascii <file>
:# 16 進(jìn)制 dump 文件:顯示完整通訊過(guò)程 $ curl 'http://httpbin.org/get' --trace trace.txt # ascii 碼 dump 文件,更加易讀 $ curl 'http://httpbin.org/get' --trace-ascii trace-ascii.txt
-
認(rèn)證:使用選項(xiàng):
-u, --user <user:password>
:# basic authentication $ curl -X GET 'https://httpbin.org/basic-auth/admin/this.is.the.password' -u 'admin:this.is.the.password' --header 'accept: application/json; charset=utf-8'
更多其他選項(xiàng)內(nèi)容庐氮,請(qǐng)查看:curl --help
语稠、man curl
、curl-manpage