從基礎到高級,帶你結合案例深入學習curl命令
摘要:本文介紹了Linux curl命令行工具的主要參數,如-A設置User-Agent,-b和-c處理Cookie,-d和--data-urlencode用于POST請求,-H添加HTTP標頭,-L跟隨重定向,-u設置認證,-x指定代理等,可用于日常HTTP請求操作,甚至替代圖形界面工具如Postman。
簡介
??在網絡通信和API調用中,Linux curl命令是一個功能強大且廣泛使用的工具。它可以與各種協議進行通信,如HTTP、HTTPS、FTP等,并支持各種操作,如下載文件、發送請求、測試API等。它功能非常強大,擁有很多參數,能夠實現各種訴求,可以這么說,postman能做到的,curl也能做到。本文將從基礎開始,介紹curl命令的基本用法,然后深入探討其高級功能和實用技巧。
??curl的基本語法如下:
curl [options] [URL...]
其中,options代表一系列可選的參數,用于更詳細地配置curl的各種特性,URL是請求的資源地址。
??常見的 options 如下:
-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 進度條顯示當前的傳送狀態
??為節約篇幅,案例分析時只貼出部分運行時的輸出。
發送get請求
??發送GET請求是獲取數據的常用方式。curl命令可以輕松發送GET請求并接收服務器返回的數據。不帶有任何參數時,curl 就是發出 GET 請求:
??上面命令向www.example.com發出 GET 請求,服務器返回的內容會在命令行輸出。
顯示通信過程-v
??在調試過程中,-v 選項可以顯示一次http通信的詳細過程,更容易看到自己設置的的參數是否已生效,包括端口連接和http request頭信息,實際使用時,不必每次都添加 -v。
curl -v http://www.rzrgm.cn/east7
??如果你覺得上面的信息還不夠,那么用選項--trace可以查看更詳細的通信過程,輸出的是原始二進制數據。
curl --trace output.txt https://www.example.com
此命令是把詳細的調試信息記錄到文件中,便于后期分析。
模仿瀏覽器 -A
??可以使用選項-A或者-H指定客戶端的用戶代理標頭User-Agent。有些網站需要使用特定的瀏覽器才能訪問,有些還需要使用某些特定的版本;服務器有時會根據這個字段針對不同設備,返回不同格式的網頁,比如手機版和桌面版。
??選項-A用來設置客戶端的設備信息,即User-Agent,示例如下:
curl -v -A 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36' http://www.rzrgm.cn/east7
上面的命令將User-Agent改成Chrome瀏覽器,從下述執行結果截圖看,已經成功設置User-Agent:

curl -v -A '' https://www.example.com
??上面命令會移除User-Agent請求頭。如果需要在http request請求頭中增加一個頭信息,就可以使用-H,案例如下:
curl —H "Content-Type:application/json" http://example.com
curl -H 'User-Agent: php/1.0' https://example.com
發送 Cookie -b
??-b參數用來向服務器發送 Cookie。
curl -b 'foo=bar' https://www.example.com
??上面命令會生成一個標頭Cookie: foo=bar,向服務器發送一個名為foo、值為bar的 Cookie。
curl -b 'foo1=bar;foo2=bar2' https://www.example.com
??上面命令發送兩個 Cookie。
curl -b cookies.txt https://www.google.com
??上面命令讀取本地文件cookies.txt,里面是服務器設置的 Cookie(參見-c參數),將其發送到服務器。
獲取cookie -c
??使用-c選項可以將服務器發送的 Cookie 寫入一個文件,例如:
curl -c cookies.txt https://www.google.com
??執行上述命令后,將服務器的 HTTP 回應所設置 Cookie 寫入文本文件cookies.txt。
偽造來源頁面 -e
??-e參數用來設置 HTTP 的請求頭 referer,表示請求的來源。很多服務器會檢查http訪問的referer從而來控制訪問權限。比如:你是先訪問首頁,然后再訪問首頁中的郵箱頁面,這里訪問郵箱的referer地址就是訪問首頁成功后的頁面地址,如果服務器發現對郵箱頁面訪問的referer地址不是首頁的地址,就斷定那是個盜鏈了。
curl -v -e 'http://www.rzrgm.cn/east7/p/18328518' https://www.example.com
上面命令把請求頭referer設為http://www.rzrgm.cn/east7/p/18328518。

??還可以通過-H選項直接添加請求頭信息Referer,達到同樣效果:
curl -H 'Referer: http://www.rzrgm.cn/east7/p/18328518' https://www.example.com
讓服務器其識別到你是從http://www.rzrgm.cn/east7/p/18328518過來的。
構造GET請求查詢字符串 -G
??-G參數用來構造GET請求 URL 的查詢字符串。
curl -G -d 'q=kitties' -d 'count=20' https://www.example.com/search
??上面命令會發出一個 GET 請求,實際請求的 URL 為https://www.example.com/search?q=kitties&count=20。如果省略-G選項,會發出一個 POST 請求。如果數據需要 URL 編碼,可以結合--data--urlencode參數。
curl -G --data-urlencode 'comment=hello world' https://www.example.com
添加HTTP請求頭 -H
首先,我們來了解一下-H選項的基本功能。它允許用戶自定義HTTP頭部信息,這些信息可以在發送HTTP請求時附加到請求中。通過添加自定義的頭部信息,用戶可以實現一些特定的功能,如設置請求頭、自定義響應狀態碼等。這對于網絡開發和調試非常有用,而且保證請求的專業性和準確性。
??當您使用-H選項自定義頭部信息時,頭部信息的語法格式要求較為嚴格。每一個請求頭信息必須以英文冒號(:)開頭,后跟key-value pairs,多個key-value 對之間用逗號(,)分隔。
curl -v -H 'token:樓蘭胡楊' https://www.example.com
??上面命令添加 HTTP 請求頭token:樓蘭胡楊,效果如下:

curl -H 'token:樓蘭胡楊' -H 'traceId:east7' https://www.example.com
??上面命令添加兩個 HTTP 請求頭。
curl -d '{"login": "emma", "pass": "123"}' -H 'Content-Type: application/json' https://www.example.com/login
??上面命令添加 HTTP 請求的標頭是Content-Type: application/json,然后用-d參數發送 JSON 數據。
顯示頭信息-i
??-i參數打印出服務器回應的 HTTP 標頭和內容。
curl -i https://www.example.com
??上面命令收到服務器回應后,先輸出服務器回應的標頭,然后空一行,再輸出網頁的源碼。-I參數只獲取網頁的頭部信息,而不獲取正文內容。這對于查看網頁的狀態碼、服務器類型、響應時間等信息非常有用。
curl -I https://www.example.com
??上面命令輸出服務器對 HEAD 請求的回應。
跳過 SSL 檢測 -k
??-k 選項指定跳過 SSL 檢測。
curl -k https://www.example.com
上面命令不會檢查服務器的 SSL 證書是否正確。
跟隨重定向 -L
??有時候,服務器會返回重定向 HTTP 狀態碼 3xx,curl 默認情況下不會自動跟隨重定向。可以使用-L 或者 --location 選項會讓 HTTP 請求跟隨服務器的重定向。curl 默認不跟隨重定向。
模擬限速 -limit-rate
??-limit-rate 用來限制 HTTP 請求和響應的帶寬,模擬慢網速的環境。
curl -limit-rate 20k https://www.example.com
??上面命令將帶寬限制在每秒 20k 字節。
設置連接超時
為了避免長時間等待無響應的服務器請求,可以使用選項 --connect-timeout 來設置連接超時時間(以秒為單位)。例如:
curl --connect-timeout 5 https://www.example.com
如果在 5 秒內無法建立連接,curl 將終止請求并返回錯誤。
文件傳送門 -F
??在日常的技術工作中,文件的上傳和下載是常見的需求。curl命令作為一個強大的網絡工具,可以方便地實現文件的上傳和下載功能,而無需依賴其它復雜的工具或服務。本節將結合案例分析簡要解讀與分析如何使用curl命令進行文件的上傳。
??-F參數指定文件路徑,以POST請求方式向服務器上傳文件。
curl -F "file=@/path/to/file.txt" http://example.com/upload
??上面命令會給 HTTP 請求加上請求頭 Content-Type: multipart/form-data,然后將文件file.txt作為file字段上傳。-F參數可以指定 MIME 類型,例如:
curl -F 'file=@photo.png;type=image/png' http://example.com/upload
??上面命令指定 MIME 類型為image/png,否則 curl 會把 MIME 類型設為application/octet-stream。-F參數也可以指定文件名,例如:
curl -F 'file=@photo.png;filename=me.png' http://example.com/upload
??上面命令中,原始文件名為photo.png,但是服務器接收到的文件名為me.png。
文件下載 -o
??選項-o(小寫)將服務器的響應內容保存到指定文件名的文件,這就等同于使用wget命令了。
curl -o myFile.zip http://example.com/file-to-download.zip
上面命令將下載http://example.com/file-to-download.zip并保存為myFile.zip,重命名了文件名。
文件下載 -O
??-O(大寫)參數將服務器回應保存成文件,并將 URL 的最后部分當作文件名。通過HTTPS下載文件時,curl會自動處理SSL/TLS連接。
??上面命令將從服務器下載名為file-to-download.zip的文件到當前目錄,文件名為file-to-download.zip。溫馨提示,這里的目標URL需要具體到某個文件,不然抓不下來。
斷點續傳 -C
??curl命令支持斷點續傳,即在下載中斷后可以從上次中斷的地方繼續下載。這對于大文件的下載非常有用。要啟用斷點續傳,可以使用-C -選項。例如:
curl -C - -O http://example.com/large-file.zip
簡化輸出 -s
??-s參數將不輸出錯誤和進度信息。
curl -s https://www.example.com
??上面命令一旦發生錯誤,不會顯示錯誤信息。不發生錯誤的話,會正常顯示運行結果。如果想讓 curl 不產生任何輸出,可以使用下面的命令。
curl -s -o /dev/null https://www.example.com
模擬用戶名密碼鑒權 -u
??-u參數用來設置服務器認證的用戶名和密碼。
curl -u 'username:password' https://www.example.com/login
??上面命令設置用戶名為username,密碼為password。
??curl 能夠識別 URL 里面的用戶名和密碼。
??上面命令能夠識別 URL 里面的用戶名和密碼,將其轉為上個例子里面的 HTTP 標頭。
curl -u 'bob' https://www.example.com/login
??上面命令只設置了用戶名,執行后,curl 會提示用戶輸入密碼。
設置代理服務器及其端口 -x
??很多場景上網需要用到代理服務器(比如是使用代理服務器上網或者因為使用 curl 別人網站而被別人屏蔽IP地址的時候),我們可以通過使用curl內置option:-x 來支持設置代理,如下所示:
curl -x 192.168.100.100:1080 http://www.baidu.com
??上面命令中,請求的代理使用 HTTP 協議。
指定HTTP請求方式-X
??-X參數指定 HTTP 請求類型(POST/GET/HEAD/DELETE/PUT/PATCH)。例如,用 -X POST 來申明發起POST請求,用 -d 代表傳輸什么數據。
curl -X POST https://www.example.com
??上面命令對https://www.example.com發出 POST 請求。同樣地,我們可以用 -X PUT 和 -X DELETE 來指定其它的請求方法。如果需要發送JSON格式的數據,可以使用-d選項,并指定值為application/json的content-type頭。例如:
curl -d '{"key1":"value1", "key2":"value2"}' -H "content-type: application/json" -X POST https://example.com/submitJson
發送 POST 請求-d
??-d參數用于發送 POST 請求的數據體,示例如下:
curl-d "login=樓蘭胡楊&password=商丘" -X POST https://www.example.com
??上述命令會發送一個包含表單數據的POST請求。使用-d參數以后,HTTP 請求會自動加上標頭Content-Type : application/x-www-form-urlencoded。并且會自動將請求轉為 POST 方法,因此可以省略-X POST。-d參數也可以讀取本地文本文件的數據,然后發送到服務器:
curl -d "@data.txt" https://www.example.com/login
??上面命令讀取data.txt文件的內容,作為數據體向服務器發送。
??在網絡通信和API調用中,發送GET和POST請求是常見的操作。Linux curl命令作為一個功能強大的工具,不僅可以用于文件傳輸,還可以方便地發送各種類型的HTTP請求。希望本教程能夠為您提供一些實用的技巧和示例,讓您能夠快速上手并熟練運用這個強悍的Linux工具。不斷實踐和探索 curl 的更多功能,將有助于您更好地理解和處理網絡請求與響應,提升在網絡編程領域的技能水平。你如果需要進一步的幫助,請隨時告訴我!希望你有個美好的一天!
Refference
Buy me a coffee. ?Get red packets.
浙公網安備 33010602011771號