在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