天天看點

Linux運維指令Curl - 日常用法總結

作者:運維老男孩

在Linux系統中,curl是一個利用URL規則在指令行下工作的檔案傳輸工具,可以說是一款很強大的http指令行工具。它支援檔案的上傳和下載下傳操作,是綜合傳輸工具,習慣上稱url為下載下傳工具。下面就日常運維中基于curl指令使用做下總結

一、Curl指令用法

1. curl文法和參數選項

# curl [option] [url]

curl常見參數

-a/--append                           上傳檔案時,附加到目标檔案
-A/--user-agent <string>              設定使用者代理發送給伺服器
-b/--cookie <name=string/file>        cookie字元串或檔案讀取位置
-c/--cookie-jar <file>                操作結束後把cookie寫入到這個檔案中
-C/--continue-at <offset>             斷點續轉
-D/--dump-header <file>               把header資訊寫入到該檔案中
-e/--referer                          來源網址
-f/--fail                             連接配接失敗時不顯示http錯誤
-o/--output                           把輸出寫到該檔案中
-O/--remote-name                      把輸出寫到該檔案中,保留遠端檔案的檔案名
-r/--range <range>                    檢索來自HTTP/1.1或FTP伺服器位元組範圍
-s/--silent                           靜音模式。不輸出任何東西
-T/--upload-file <file>               上傳檔案
-u/--user <user[:password]>           設定伺服器的使用者和密碼
-w/--write-out [format]               什麼輸出完成後
-x/--proxy <host[:port]>              在給定的端口上使用HTTP代理
-#/--progress-bar                     進度條顯示目前的傳送狀态。或者直接使用"--progress"           

2. curl使用說明

curl是一種指令行工具,作用是發出網絡請求,然後得到和提取資料,顯示在"标準輸出"(stdout)上面。它支援多種協定,下面說下curl指令的日常使用示例:

1)擷取頁面内容,即檢視網頁源碼  >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
當不加任何option使用 curl 時,預設會發送 GET 請求來擷取連結内容到标準輸出
[root@ss-server ~]# curl https://www.baidu.com
  
2)顯示http頭部資訊,即隻列印響應頭部資訊  >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
如果隻想要顯示 HTTP 頭,而不顯示檔案内容,可以使用 -I 或 --head 選項
[root@ss-server ~]# curl --head https://www.baidu.com
[root@ss-server ~]# curl -I https://www.baidu.com
HTTP/1.1 200 OK
Accept-Ranges: bytes
Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
Connection: Keep-Alive
Content-Length: 277
Content-Type: text/html
Date: Mon, 23 Dec 2019 10:50:55 GMT
Etag: "575e1f6f-115"
Last-Modified: Mon, 13 Jun 2016 02:50:23 GMT
Pragma: no-cache
Server: bfe/1.0.8.18
  
如果想要同時顯示 HTTP 頭和檔案内容,使用 -i 選項
[root@ss-server ~]# curl -i https://www.baidu.com 
  
注意:
"-I"參數則是隻顯示http response的頭資訊。
"-i"參數可以顯示http response的頭資訊,連同網頁代碼一起。
  
3)顯示通信過程  >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
"-v"參數可以顯示一次http通信的整個過程,包括端口連接配接和http request頭資訊。
[root@ss-server ~]# curl -v www.sina.com
  
如果覺得上面的資訊還不夠,可以使用下面的指令檢視更詳細的通信過程。
[root@ss-server ~]# curl --trace output.txt www.sina.com
或者
[root@ss-server ~]# curl --trace-ascii output.txt www.sina.com
運作後,可以打開output.txt檔案檢視。
  
4)下載下傳頁面  >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
curl指令可以用來執行下載下傳、發送各種HTTP請求,指定HTTP頭部等操作。如果系統沒有curl可以使用"yum install curl"安裝,也可以下載下傳安裝。
curl是将下載下傳連結輸出到stdout,将進度資訊輸出到stderr。
--silent選項:表示不顯示進度條資訊
--progress選項:表示顯示進度條資訊。或者使用"-#",或者使用"--progress-bar"
  
[root@ss-server ~]# curl --silent https://www.baidu.com
這條指令是将下載下傳連結輸出到終端,所有下載下傳的資料都被寫入到stdout。
  
還可以将下載下傳的連結儲存到檔案
可以使用 > 符号将輸出重定向到本地檔案中。
[root@ss-server ~]# curl --silent https://www.baidu.com > haha.txt
  
-o(小寫的 o):結果會被儲存到指令行中提供的檔案名
-O(大寫的 O):URL 中的檔案名會被用作儲存輸出的檔案名
  
[root@ss-server ~]# curl https://www.baidu.com -o baobei.txt --progress
[root@ss-server ~]# curl --silent -O https://www.baidu.com/haha.html
  
需要注意:
使用 -O 選項時,必須確定連結末尾包含檔案名,否則 curl 無法正确儲存檔案。
如果遇到連結中無檔案名的情況,應該使用 -o 選項手動指定檔案名,或使用重定向符号。
  
5)同時下載下傳多個頁面  >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
以使用 -o 或 -O 選項來同時指定多個連結,按照以下格式編寫指令:
[root@ss-server ~]# curl -O https://www.baidu.com/haha/page1.html -O https://www.baidu.com/haha/page2.html
  
或者:
[root@ss-server ~]# curl -o page1 https://www.baidu.com/haha/page1.html -o page2 https://www.baidu.com/haha/page2.html
  
6)使用-L跟随連結重定向,即自動跳轉  >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
如果直接使用curl打開某些被重定向後的連結,這種情況下就無法擷取想要的網頁内容。
使用"-L"參數,curl就會自動跳轉到新的網址。
[root@ss-server ~]# curl http://kevin.com
會得到如下資訊:
<html>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx/1.10.3</center>
</body>
</html>
  
而當通過浏覽器打開該連結時,會自動跳轉到 http://www.kevin.com。
此時如果想要curl做的,就是像浏覽器一樣跟随連結的跳轉,擷取最終的網頁内容。
這時就需要在指令中添加-L選項來跟随連結重定向,這樣就能擷取到經過重定向後的網頁内容了。
[root@ss-server ~]# curl -L http://kevin.com
  
7)斷點續傳  >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
偏移量是以位元組為機關的整數,如果讓curl自動推斷出正确的續傳位置使用-C -:
# curl -C - URL
[root@ss-server ~]# curl -C - https://www.baidu.com
  
8)提供Referer字段,設定參照頁字元串  >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
參照頁是位于HTTP頭部中的一個字元串,用來表示使用者是從哪個頁面到達目前頁面的。
如果使用者點選網頁A中的某個連接配接,那麼使用者就會跳轉到B網頁,網頁B頭部的參照頁字元串就包含網頁A的URL。
  
使用--referer選項指定參照頁字元串,即檢視來源網址。
有時需要在http request頭資訊中,提供一個referer字段,表示你是從哪裡跳轉過來的。
[root@ss-server ~]# curl --referer https://www.baidu.com https://www.baidu.com
  
9)設定cookies  >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
當使用curl通路頁面的時候,預設是不會儲存 Cookie 的。有些情況下我們希望儲存 Cookie 以便下次通路時使用。例如登陸了某個網站,我們希望再次通路該網站時保持登陸的狀态,這時就可以現将登陸時的 Cookie 儲存起來,下次通路時再讀取。
  
使用--cookie "COKKIES"選項來指定cookie,多個cookie使用分号分隔:
# curl --cookie "name=xxxx" www.example.com
# curl --cookie "name=xxxx;age=xxxx;address=xxxx" www.example.com
  
如下指令,表示将url中的user和pass内容發送給了cookie
[root@ss-server ~]# curl https://www.baidu.com --cookie "user=root;pass=123456"
  
至于具體的cookie的值,可以從http response頭資訊的'Set-Cookie'字段中得到。
  
如果想要将cookie另存為一個檔案,使用--cookie-jar選項,即-c參數。
'-c cookie-file'可以儲存伺服器傳回的cookie到檔案;
'-b cookie-file'可以讀取這個檔案作為cookie資訊,進行後續的請求。
  
[root@ss-server ~]# curl --cookie-jar cookie_txt https://www.baidu.com
[root@ss-server ~]# curl -c cookie_txt https://www.baidu.com
  
[root@ss-server ~]# curl -b haha.txt https://www.baidu.com
  
10)自定義User-Agent字段,設定使用者代理字元串  >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
這個字段是用來表示用戶端的裝置資訊。伺服器有時會根據這個字段,針對不同裝置,傳回不同格式的網頁。
  
有些網站通路會提示隻能使用IE浏覽器來通路,這是因為這些網站設定了檢查使用者代理,可以使用curl把使用者代理設定為IE,這樣就可以通路了。
使用--user-agent或者-A選項自定義使用者代理,指令如下:
# curl URL --user-agent "Mozilla/5.0"
# curl URL -A "Mozilla/5.0"
[root@ss-server ~]# curl https://www.baidu.com --user-agent "Mozilla/5.0"
  
例如下面的指令将僞裝成安卓火狐浏覽器對網頁進行請求(使用-H也可以實作同樣的目的,見下面說明):
[root@ss-server ~]# curl -A "Mozilla/5.0 (Android; Mobile; rv:35.0) Gecko/35.0 Firefox/35.0" http://www.baidu.com
  
11)使用 -H 自定義 header  >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
當使用curl通路頁面,需要傳遞特定的header的時候,可以仿照以下指令來寫:
[root@ss-server ~]# curl -H "Referer: www.example.com" -H "User-Agent: Custom-User-Agent" http://www.baidu.com
可以看到,當使用-H 來自定義User-Agent時,需要使用 "User-Agent: xxx"的格式。-H可以傳遞多個Header頭部資訊
  
也能夠直接在 header 中傳遞 Cookie,格式與上面的例子一樣(指定cookie的其他方式已在上面介紹過):
[root@ss-server ~]# curl -H "Cookie: JSESSIONID=D0112A5063D938586B659EF8F939BE24" http://www.example.com
  
12)curl的帶寬控制和下載下傳配額  >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
使用--limit-rate限制curl的下載下傳速度,如下指令中用k(千位元組)和m(兆位元組)指定下載下傳速度限制。
[root@ss-server ~]# curl https://www.baidu.com --limit-rate 50k
[root@ss-server ~]# curl https://www.baidu.com --limit-rate 5m
  
使用--max-filesize指定可下載下傳的最大檔案大小。
如果檔案大小超出限制,指令則傳回一個非0退出碼,如果指令正常則傳回0。
# curl URL --max-filesize bytes
[root@ss-server ~]# curl https://www.baidu.com --max-filesize 10000
  
13)用curl進行認證  >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
使用curl選項 -u 可以完成HTTP或者FTP的認證,可以指定密碼,也可以不指定密碼在後續操作中輸入密碼:
# curl -u user:pwd http://man.linuxde.net
# curl -u user http://man.linuxde.net
  
如下,登入這個頁面需要輸入使用者名和密碼,可以使用-u參數進行認證
[root@ss-server ~]# curl -u kevin:wanhju1980@123 https://account.cnblogs.com/signin?returnUrl=http%3a%2f%2fi.cnblogs.com%2f
或者:
[root@ss-server ~]# curl -u kevin https://account.cnblogs.com/signin?returnUrl=http%3a%2f%2fi.cnblogs.com%2f
Enter host password for user 'kevin':
  
14)發送表單資訊
發送表單資訊有GET和POST兩種方法。
GET方法相對簡單,隻要把資料附在網址後面就行(http://可以省略)。
[root@ss-server ~]# curl example.com/form.cgi?data=xxx
[root@ss-server ~]# curl http://example.com/form.cgi?data=xxx
  
POST方法必須把資料和網址分開,curl就要用到--data參數或-d參數。
[root@ss-server ~]# curl -X POST --data "data=xxx" http://example.com/form.cgi
[root@ss-server ~]# curl -X POST -d "data=xxx" http://example.com/form.cgi
  
如果資料沒有經過表單編碼,還可以讓curl為你編碼,參數是"--data-urlencode"
[root@ss-server ~]# curl -X POST --data-urlencode "date=April 1" example.com/form.cgi
  
再來看下面一個例子:
############  使用-d發送POST請求  ############
以登陸網頁為例來進行說明使用curl發送POST請求的方法。
假設有一個登入頁面www.example.com/login,隻需要送出使用者名和密碼便可登入。
則可以使用 cURL 來完成這個POST請求。
-d 用于指定發送的資料,相當于--date
-X 用于指定發送資料的方式:
[root@ss-server ~]# curl -d "userName=kevin&passwd=123456" -X POST http://www.example.com/login
  
在使用-d的情況下,如果省略 -X,則預設為 POST 方式:
[root@ss-server ~]# curl -d "userName=kevin&passwd=123456" http://www.example.com/login
  
############  強制使用GET方式  ############
# curl -d "somedata" -X GET http://www.example.com/api
或者使用 -G 選項:
# curl -d "somedata" -G http://www.example.com/api
  
GET方法隻要把資料附在網址後面就行。
# curl example.com/form.cgi?data=xxx
  
curl預設的HTTP動詞是GET,使用-X參數可以支援其他動詞。例如:
# curl -X DELETE
  
############  從檔案中讀取data  ############
# curl -d "@data.txt" http://www.example.com/login
  
############  帶Cookie登入  ############
如果再次通路該網站,仍然會變成未登入的狀态。可以用之前提到的方法儲存 Cookie,在每次通路網站時都帶上該 Cookie 以保持登入狀态。
'-c cookie-file'可以儲存伺服器傳回的cookie到檔案;
[root@ss-server ~]# curl -c "cookie-login" -d "userName=tom&passwd=123456" http://www.example.com/login
  
再次通路該網站時,使用以下指令:
'-b cookie-file'可以讀取這個檔案作為cookie資訊,進行後續的請求。
[root@ss-server ~]# curl -b "cookie-login" http://www.example.com/login
這樣,就能保持通路的是登入後的頁面了。
  
15)HTTP動詞  >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
curl預設的HTTP動詞是GET,使用`-X`參數可以支援其他動詞。
[root@ss-server ~]# curl -X POST www.example.com
[root@ss-server ~]# curl -X DELETE www.example.com           

3. curl上傳檔案的用法(POST請求方式)

一般來說,我們都會用curl下載下傳網頁,但是curl上傳檔案則不常用。下面說下curl模拟"multipart/form-data"形式的form上傳檔案, 指令稍稍複雜些。

之前的請求基本都是隻傳輸字元串,如果需要上傳檔案,比如在測試上傳接口的時候,會要求傳輸檔案,其實這個對于curl來說,也是很容器的!
使用-F "file=@__FILE_PATH__" 的請示,傳輸檔案即可。
 
[root@ss-server ~]# curl -F "filename=@/data/www/test.tar.gz" http://localhost:9090/action.php
[root@ss-server ~]# curl localhost:8000/api/v1/upimg -F "file=@/Users/fungleo/Downloads/401.png" -H "token: 222" -v
 
如果使用了-F參數,curl就會以 multipart/form-data 的方式發送POST請求。
-F參數以name=value的方式來指定參數内容,如果是一個檔案,則需要以name=@file的方式來指定。
 
如果通過代理,上面的指令有可能會被代理拒絕,這時需要指定上傳檔案的MIME媒體類型。指令如下:
-x參數:在給定的端口上使用HTTP代理。相當于--proxy
[root@ss-server ~]# curl -x kevin.com:1080 -F "filename=@/data/www/test.tar.gz;type=application/octet-stream" http://localhost:9090/action.php
 
此外,如果不上傳檔案,則可以使用"-d"參數,這時curl會以application/x-www-url-encoded 方式發送 POST 請求。指令如下:
[root@ss-server ~]# url -d "action=del&name=archer" -d "id=12" http://localhost:9090/action.php           

4. curl常用示例

############ 正常通路 ############
# curl http://www.baidu.com
 
############ 檔案名正則 ############
# curl ftp://ftp.baidu.cn/file[1-100].txt  
# curl ftp://ftp.baidu.cn/file[001-100].txt 
# curl ftp://ftp.baidu.cn/file[a-z].txt 
# curl ftp://ftp.baidu.cn/file[a-z:2].txt 
 
############ 域名正則 ############
# curl http://site.{one,two,three}.com 
 
############ 目錄正則 ############
# curl http://www.baidu.com/archive[1996-1999]/vol[1-4]/part{a,b,c}.html 
 
############ 正常下載下傳頁面 ############
# curl -o index.html http://www.baidu.com/ 
# curl http://www.baidu.com/ > index.html 
 
############ 添加下載下傳進度條 ############
# curl -# http://www.baidu.com/   > index.html 
# curl --progress http://www.baidu.com/   > index.html
# curl --progress-bar http://www.baidu.com/   > index.html
 
############ 使用不同的版本的http協定 ############
預設1.0版本
# curl -0 http://www.baidu.com 
 
指定版本
# curl --http1.1 http://www.baidu.com
# curl --http2 http://www.baidu.com 
 
############ 使用不同的ssl版本通路 ############
tlsv1
# curl -1 http://www.baidu.com 
# curl --tlsv1 http://www.baidu.com
 
sslv2
# curl -2 http://www.baidu.com 
# curl --sslv2 http://www.baidu.com
 
sslv3
# curl -3 http://www.baidu.com 
# curl --sslv3 http://www.baidu.com
 
############ 使用不同的ip協定 ############
ipv4
# curl -4 http://www.baidu.com 
# curl --ipv4 http://www.baidu.com
 
ipv6
# curl -6 http://www.baidu.com 
# curl --ipv6 http://www.baidu.com
 
############ 指定user-agent ############
# curl -A "wget/1.0" http://www.baidu.com 
# curl --user-agent "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)"  http://www.baidu.com 
# curl --user-agent "Mozilla/4.73 [en] (X11; U; Linux 2.2.15 i686)"  http://www.baidu.com 
 
############ 指定cookie ############
# curl -b "phpsession=Testtest" http://www.baidu.com 
# curl --cookie "name=Daniel" http://www.baidu.com 
 
############ 指定cookie檔案 ############
# curl -c cookies.txt http://www.baidu.com 
# curl --cookie-jar cookies.txt http://www.baidu.com 
 
############ 送出post資料 ############
# curl -d "username=admin&password=pass" http://www.baidu.com 
# curl --data "birthyear=1905&press=%20OK%20"  http://www.baidu.com/when.cgi
# curl --data-urlencode "name=I am Daniel" http://curl.haxx.se
# curl --data "<xml>" --header "Content-Type: text/xml" --request PROPFIND url.com
 
############ 指定referer ############
# curl -e "http://www.baidu.com/referer" http://www.baidu.com 
# curl --referer http://www.baidu.com/referer http://www.baidu.com 
 
############ 指定header ############
# curl --header "Host:www.baidu.com" http://www.baidu.com 
 
############ 顯示通路網頁的header ############
# curl -D - http://www.baidu.com 
# curl --dump-header headers_and_cookies http://www.baidu.com
 
############ 跟随location跳轉頁面 ############
# curl -L http://www.baidu.com
# curl --location http://www.baidu.com
 
############ 指定dns通路網站 ############
# curl --dns-servers 8.8.8.8 http://www.baidu.com
 
############ 指定證書通路https的網頁 ############
# curl --cert mycert.pem https://www.baidu.com
 
 
#############################################################################################
運維工作中常見的curl指令操作
#############################################################################################
1)抓取頁面内容到一個檔案中
# curl -o home.html http://www.kevin.net/bobo218558
 
正則比對下載下傳,比如下載下傳後的檔案001-nick.JPG
# curl -o #2_#1.jpg http://www.kevin.net/bobo218558/{zzh,nick}/[001-201].JPG
 
2)用-O,後面的url要具體到某個檔案,不然抓不下來
# curl -O http://www.kevin.net/bobo218558/dd.jpg
 
3)模拟表單資訊,模拟登入,儲存cookie資訊
# curl -c ./cookie_c.txt -F log=aaaa -F pwd=****** http://www.kevin.net/bobo218558
 
4)模拟表單資訊,模拟登入,儲存頭資訊
# curl -D ./cookie_D.txt -F log=aaaa -F pwd=****** http://www.kevin.net/bobo218558
-c(小寫)産生的cookie和-D裡面的cookie是不一樣的。
 
5)使用cookie
# curl -b ./cookie_c.txt http://www.kevin.net/bobo218558
# curl http://www.kevin.net/bobo218558 –cookie "user=root;pass=123456" 多個用;分開
 
6)斷點續傳,-C(大寫的)
# curl -C - https://www.baidu.com
 
7)傳送資料,最好用登入頁面測試,因為你傳值過去後,curl回抓資料,你可以看到你傳值有沒有成功
# curl -d log=aaaa http://www.kevin.net/bobo218558
 
8)顯示抓取錯誤。
# curl -f http://www.kevin.net/bobo218558
 
9)僞造來源位址,有的網站會判斷,請求來源位址。
# curl -e http://www.kevin.net/bobo218558 http://www.kevin.net/bobo218558
 
10)當經常用curl去通路别人網址的時候,人家會把你的IP給屏蔽掉的,這個時候,我們可以用代理
# curl -x 24.10.28.84:32779 -o home.html http://www.kevin.net/bobo218558
 
11)比較大的東西,我們可以分段下載下傳
# curl -r 0-100 -o img.part1 http://www.kevin.net/bobo218558
# ls |grep part | xargs du -sh
用的時候,把他們cat一下就OK了
# cat img.part* >img.jpg
 
12)不會顯示下載下傳進度資訊(-s 等于 --silent)
# curl -s -o aaa.txt https://www.baidu.com
 
13)顯示下載下傳進度條
# curl -# -O https://www.baidu.com/test.html
 
14)通過ftp下載下傳檔案
# curl -u 使用者名:密碼 -O http://www.kevin.net/bobo218558
或者用下面的方式
# curl -O ftp://使用者名:密碼@ip:port/demo/curtain/bbstudy_files/style.css
 
15)通過ftp上傳
# curl -T test.sql ftp://使用者名:密碼@ip:port/demo/curtain/bbstudy_files/
 
16)使用–limit-rate限制curl的下載下傳速度
# curl http://www.kevin.com/har/test –limit-rate 50k
指令中用k(千位元組)和m(兆位元組)指定下載下傳速度限制。
 
17) 使用--max-filesize指定可下載下傳的最大檔案大小
# curl http://www.kevin.com/har/test --max-filesize 10000
如果檔案大小超出限制,指令則傳回一個非0退出碼,如果指令正常則傳回0。
 
18)使用curl選項 -u 可以完成HTTP或者FTP的認證,可以指定密碼,也可以不指定密碼在後續操作中輸入密碼
# curl -u user:pwd http://www.kevin.net/bobo218558
# curl -u user http://www.kevin.net/bobo218558
 
19)通過-I或者-head可以隻列印出HTTP頭部
# curl -I http://www.kevin.net/bobo218558
 
20)有些網站通路會提示隻能使用IE浏覽器來通路,這是因為這些網站設定了檢查使用者代理,可以使用curl把使用者代理設定為IE,這樣就可以通路了。
使用–user-agent或者-A選項
# curl http://********* --user-agent "Mozilla/5.0"
# curl http://********* -A "Mozilla/5.0"
 
21)其他HTTP頭部資訊也可以使用curl來發送,使用-H"頭部資訊" 傳遞多個頭部資訊
# curl -H "Host:man.linuxde.net" -H "accept-language:zh-cn" http://***********
以json 格式請求
# curl -H "Content-Type: application/json" -X POST --data '{"data":"1"}' http://127.0.0.1/
 
22)一個伺服器端常用的限制方法,就是檢查http通路的referer。
比如你先通路首頁,再通路裡面所指定的下載下傳頁,這第二次通路的 referer位址就是第一次通路成功後的頁面位址。
這樣,伺服器端隻要發現對下載下傳頁面某次通路的referer位址不是首頁的位址,就可以斷定那是個盜鍊了。
curl給我們提供了設定referer的option: -e
# curl -A "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" -x 113.114.115.6:1080 -e "mail.linuxidc.com" -o page.html -D cookie0001.txt http://www.kevin.com
 
22)輸出完成後自定義列印資訊
# curl -w '{
"time_namelookup": %{time_namelookup},
"time_connect": %{time_connect},
"time_appconnect": %{time_appconnect},
"time_pretransfer": %{time_pretranfer},
"time_redirect": %{time_redirect},
"time_starttransfer": %{time_starttransfer},
"time_total": %{time_total},
"speed_download": %{speed_download},
"speed_upload": %{speed_upload},
"remote_ip": "%{remote_ip}",
"remote_port": "%{remote_port}",
"local_ip": "%{local_ip}",
"local_port": "%{local_port}"
}' -D /tmp/tmpOUQ_P_ -o /tmp/tmpAUjoDh -s -S 'http://www.kevin.net/bobo218558/search/universal/v2?m=s&query=is_list=1%26info_type=1%26info_source=1%26size=20'           

5. curl指令的逾時時間

curl指令有兩個逾時時間:一個是連接配接逾時時間,另一個是整個過程允許的最大時間!
 
--connect-timeout <seconds>
這個是指定連接配接逾時時間。 如果出錯, 提示形如:curl: (28) connect() timed out!   比如指令"curl --connect-timeout 10 ......"
 
-m/--max-time <seconds>
這個是指定整個過程最大的允許時間。 出錯提示如:curl: (28) Operation timed out after 2000 milliseconds with 0 bytes received!  比如指令"curl -m 60 ......."
 
除此之外,curl指令還可以這樣使用:
# curl -o kevin.log "http://www.ru.com" --speed-time 5 --speed-limit 1
表示将url内容儲存到kevin.log中, 如果傳輸速度小于1位元組/秒的狀态持續5秒,該連接配接就會終止.           

二、Curl的GET、POST、PUT、DELETE請求

1. GET、POST、PUT、DELETE含義與差別

############ 簡單的來了解 ############
GET     /uri/xxx   檢視(相當于資料庫中的select操作),即通過請求URL獲得資源。
PUT     /uri/xxx   更新/建立(相當于資料庫中的update操作),即通過請求URL修改某個内容。
POST    /uri       建立 (相當于資料庫中的insert操作),即通過請求URL添加新的資源,用于表單送出。
DELETE  /uri/xxx   删除 (相當于資料庫中的delete操作),即通過請求URL删除某個内容。
  
############ 含義 ############
1)GET請求:得到或檢視資料
GET請求會向資料庫發索取資料的請求,進而來擷取資訊,該請求就像資料庫的select操作一樣,隻是用來查詢一下資料,不會修改、增加資料,不會影響資源的内容。
也就是說GET請求不會産生副作用。無論進行多少次操作,結果都是一樣的。
  
2)PUT請求:在已經存在的資料上更新資料
與GET請求不同的是,PUT請求是向伺服器端發送資料的,進而改變資訊,該請求就像資料庫的update操作一樣,用來修改資料的内容,但是不會增加資料的種類等。
也就是說無論進行多少次PUT操作,其結果并沒有不同。
  
3)POST請求:建立資料
POST請求同PUT請求類似,都是向伺服器端發送資料的,但是該請求會改變資料的種類等資源,就像資料庫的insert操作一樣,會建立新的内容。
幾乎目前所有的送出操作都是預設用POST請求的。
  
4)DELETE請求:删除資料
DELETE請求顧名思義,就是用來删除某一個資源的,該請求就像資料庫的delete操作。
  
############ 安全性方面 ############
1)GET請求的操作是安全的。
所謂安全是指不管進行多少次操作,資源的狀态都不會改變。比如用GET請求方式浏覽文章,不管浏覽多少次,那篇文章還在那,沒有變化。
當然有人可能會說每浏覽一次文章,文章的浏覽數就增加一次,這不也改變了資源的狀态麼。
其實這并不沖突,因為這個改變不是GET操作引起的,而是使用者自己設定的服務端邏輯造成的。
  
2)PUT,DELETE請求的操作是幂等的。 
所謂幂等:是指無論進行多少次重複操作,都是實作相同的結果。也就是說若輸入相同的參數執行任意次結果相同,則為等幂操作!!!!
比如我用PUT修改一篇文章,然後在做同樣的操作,每次操作後的結果并沒有不同,DELETE也是一樣。
順便說一句,因為GET操作是安全的,是以它自然也是幂等的。
  
3)POST操作既不是安全的,也不是幂等的
比如常見的POST重複加載問題:當多次發出同樣的POST請求後,其結果是建立出了若幹的資源。
  
4)安全和幂等的意義在于:
當操作沒有達到預期的目标時,我們可以不停的重試,而不會對資源産生副作用。從這個意義上說,POST操作往往是有害的,但很多時候我們還是不得不使用它。
  
5)需要注意事項
建立操作可以使用POST請求,也可以使用PUT請求!差別在于:
POST 是作用在一個集合資源之上的(/uri),而PUT操作是作用在一個具體資源之上的(/uri/xxx)。
再通俗點說,如果URL可以在用戶端确定,那麼就使用PUT請求,如果是在服務端确定,那麼就使用POST請求。
比如說很多資源使用資料庫自增主鍵作為辨別資訊,而建立的資源的辨別資訊到底是什麼隻能由服務端提供,這個時候就必須使用POST請求方法了。
 
是以,簡單總結下:
GET,POST,PUT都是幂等性操作,而POST不是幂等性操作;
GET:不管對資源查詢多少次,此實作都是一樣的
PUT:将A第一次修改成B,再進行多次操作,最終結果還是還算B,與第一次寫的結果是一樣的,所有PUT是
DELETE:第一次把資源删除以後,後面進行多少次操作都算資源被删除
POST:  不是,因為一次請求添加一份新的資源,二次請求是乎産生不同的結
  
############ 差別 ############
1)GET請求 和 POST請求
從字面意思就可以看出兩者差別,一個是GET(擷取),一個是POST(發送)。
  
GET方法的請求用來告訴伺服器需要擷取哪些内容(uri+query),向靜态頁面(uri)請求則直接傳回檔案内容給浏覽器,向一個動态頁面請求時可以
提供查詢參數(query)以獲得相應内容。
  
POST方法的請求用來向伺服器送出内容,主要是為了送出,而不是為了請求内容,就是說POST的初衷并不要求伺服器傳回内容,隻是送出内容讓伺服器
處理(主要是存儲或者處理之後再存儲)。
  
2)PUT請求 和 POST請求
PUT請求主要作用在一個具體資源之上的(即uri/xxx),POST請求主要作用在一個集合資源之上的(即uri)
就是說,如果URL可以在用戶端确定就使用PUT請求,如果URL在服務端确定就使用POST請求。
  
PUT請求和POST請求容器混淆的就是它們都可以修改資料。它們的差別在于是否等幂:PUT請求是等幂操作,而POST請求是不等幂操作。
是以POST方式每執行一次會增加一條資料,而PUT請求是在已經存在的資料上進行修改。
也就是說POST方式一般用于增加資料,POST方式用于修改已有資料。           

2. GET、POST、PUT、DELETE四種請求方式的curl通路

-v 顯示請求的資訊
-X 選項指定其它協定
 
GET請求方式
# curl -v 172.16.60.21:8080/caijin/age/18
 
POST請求方式
# curl -v 172.16.60.21:8080/caijin -d 'age=14&cupSize=C'
# curl -v -X POST 172.16.60.21:8080/caijin -d 'age=14&cupSize=C'
 
PUT請求方式
# curl -v -X PUT -d "age=19&cupSize=C" 172.16.60.21:8080/caijin/3
# curl -X PUT --header 'Content-Type: application/json' --header 'Accept: application/json' -d '{"message":"aaaa","exchange_id":"123" }' 'http://localhost:9090/service/record'
 
DELETE請求方式
# curl -v -X DELETE 172.16.60.21:8080/caijin/3           
原文位址:https://www.cnblogs.com/kevingrace/p/9030324.html

繼續閱讀