簡介
curl 是常用的命令行工具,用來請求 Web 服務器。它的名字就是客戶端(client)的 URL 工具的意思。
它的功能非常強大,命令行參數多達幾十種。如果熟練的話,完全可以取代 Postman 這一類的圖形界面工具。
不帶有任何參數時,curl 就是發出 GET 請求。
$ curl https://www.example.com
上面命令向www.example.com發出 GET 請求,服務器返回的內容會在命令行輸出。
-A
-A參數指定客戶端的用戶代理標頭,即User-Agent。curl 的默認用戶代理字符串是curl/[version]。
$ curl -A 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36' https://google.com
上面命令將User-Agent改成 Chrome 瀏覽器。
$ curl -A '' https://google.com
上面命令會移除User-Agent標頭。
也可以通過-H參數直接指定標頭,更改User-Agent。
$ curl -H 'User-Agent: php/1.0' https://google.com
-b
-b參數用來向服務器發送 Cookie。
$ curl -b 'foo=bar' https://google.com
上面命令會生成一個標頭Cookie: foo=bar,向服務器發送一個名為foo、值為bar的 Cookie。
$ curl -b 'foo1=bar' -b 'foo2=baz' https://google.com
上面命令發送兩個 Cookie。
$ curl -b cookies.txt https://www.google.com
上面命令讀取本地文件cookies.txt,里面是服務器設置的 Cookie(參見-c參數),將其發送到服務器。
-c
-c參數將服務器設置的 Cookie 寫入一個文件。
$ curl -c cookies.txt https://www.google.com
上面命令將服務器的 HTTP 回應所設置 Cookie 寫入文本文件cookies.txt。
-C switch是恢復我們文件傳輸的設備,但還要注意,它后面緊跟一個破折號(-)。這告訴cURL繼續文件傳輸,但是實現這一步,首先要查看已經下載的部分,找到下載的最后一個字節才可以確定從何處可以恢復。
curl -C - example.com/some-file.zip --output MyFile.zip
-d
-d參數用於發送 POST 請求的數據體。
$ curl -d'login=emma&password=123'-X POST https://google.com/login
# 或者
$ curl -d 'login=emma' -d 'password=123' -X POST https://google.com/login
使用-d參數以后,HTTP 請求會自動加上標頭Content-Type : application/x-www-form-urlencoded。並且會自動將請求轉為 POST 方法,因此可以省略-X POST。
-d參數可以讀取本地文本文件的數據,向服務器發送。
$ curl -d '@data.txt' https://google.com/login
上面命令讀取data.txt文件的內容,作為數據體向服務器發送。
--data-urlencode
--data-urlencode參數等同於-d,發送 POST 請求的數據體,區別在於會自動將發送的數據進行 URL 編碼。
$ curl --data-urlencode 'comment=hello world' https://google.com/login
上面代碼中,發送的數據hello world之間有一個空格,需要進行 URL 編碼。
-e
-e參數用來設置 HTTP 的標頭Referer,表示請求的來源。
curl -e 'https://google.com?q=example' https://www.example.com
上面命令將Referer標頭設為https://google.com?q=example。
-H參數可以通過直接添加標頭Referer,達到同樣效果。
curl -H 'Referer: https://google.com?q=example' https://www.example.com
-F
-F參數用來向服務器上傳二進制文件。
$ curl -F 'file=@photo.png' https://google.com/profile
上面命令會給 HTTP 請求加上標頭Content-Type: multipart/form-data,然后將文件photo.png作為file字段上傳。
-F參數可以指定 MIME 類型。
$ curl -F 'file=@photo.png;type=image/png' https://google.com/profile
上面命令指定 MIME 類型為image/png,否則 curl 會把 MIME 類型設為application/octet-stream。
-F參數也可以指定文件名。
$ curl -F 'file=@photo.png;filename=me.png' https://google.com/profile
上面命令中,原始文件名為photo.png,但是服務器接收到的文件名為me.png。
-G
-G參數用來構造 URL 的查詢字符串。
$ curl -G -d 'q=kitties' -d 'count=20' https://google.com/search
上面命令會發出一個 GET 請求,實際請求的 URL 為https://google.com/search?q=kitties&count=20。如果省略--G,會發出一個 POST 請求。
如果數據需要 URL 編碼,可以結合--data--urlencode參數。
$ curl -G --data-urlencode 'comment=hello world' https://www.example.com
-H
-H參數添加 HTTP 請求的標頭。
$ curl -H 'Accept-Language: en-US' https://google.com
上面命令添加 HTTP 標頭Accept-Language: en-US。
$ curl -H 'Accept-Language: en-US' -H 'Secret-Message: xyzzy' https://google.com
上面命令添加兩個 HTTP 標頭。
$ curl -d '{"login": "emma", "pass": "123"}' -H 'Content-Type: application/json' https://google.com/login
上面命令添加 HTTP 請求的標頭是Content-Type: application/json,然后用-d參數發送 JSON 數據。
-i
-i參數打印出服務器回應的 HTTP 標頭。
$ curl -i https://www.example.com
上面命令收到服務器回應后,先輸出服務器回應的標頭,然后空一行,再輸出網頁的源碼。
-I
-I參數向服務器發出 HEAD 請求,然會將服務器返回的 HTTP 標頭打印出來。
$ curl -I https://www.example.com
上面命令輸出服務器對 HEAD 請求的回應。
--head參數等同於-I。
$ curl --head https://www.example.com
-k
-k參數指定跳過 SSL 檢測。
$ curl -k https://www.example.com
上面命令不會檢查服務器的 SSL 證書是否正確。
-L
-L參數會讓 HTTP 請求跟隨服務器的重定向。curl 默認不跟隨重定向。
$ curl -L -d 'tweet=hi' https://api.twitter.com/tweet
--limit-rate
--limit-rate用來限制 HTTP 請求和回應的帶寬,模擬慢網速的環境。
$ curl --limit-rate 200k https://google.com
上面命令將帶寬限制在每秒 200K 字節。
-m switch指定執行命令所需的最長時間。
經過指定的時間后,cURL將退出正在執行的操作,即使它正在下載或上傳文件。cURL會以秒為單位指定您想要的最長時間。因此,要在一分鍾后超時,該命令將如下所示:
$ curl -m 60 example.com
您可以使用cURL指定的另一種超時類型是用於鏈接的時間量。這有助於確保cURL不會花費過多的時間來嘗試連接處於脫機狀態或無法訪問的主機。
它也接受秒作為參數。該選項被寫為–connect-timeout。
$ curl --connect-timeout 60 example.com
-o, --output
-o參數將服務器的回應保存成文件,等同於wget命令。
$ curl -o example.html https://www.example.com
上面命令將www.example.com保存成example.html。
-O
-O參數將服務器回應保存成文件,並將 URL 的最后部分當作文件名。
$ curl -O https://www.example.com/foo/bar.html
上面命令將服務器回應保存成文件,文件名為bar.html。
-s
-s參數將不輸出錯誤和進度信息。
$ curl -s https://www.example.com
上面命令一旦發生錯誤,不會顯示錯誤信息。不發生錯誤的話,會正常顯示運行結果。
如果想讓 curl 不產生任何輸出,可以使用下面的命令。
$ curl -s -o /dev/null https://google.com
-S
-S參數指定只輸出錯誤信息,通常與-o一起使用。
$ curl -s -o /dev/null https://google.com
上面命令沒有任何輸出,除非發生錯誤。
-u
-u參數用來設置服務器認證的用戶名和密碼。
$ curl -u 'bob:12345' https://google.com/login
上面命令設置用戶名為bob,密碼為12345,然后將其轉為 HTTP 標頭Authorization: Basic Ym9iOjEyMzQ1。
curl 能夠識別 URL 里面的用戶名和密碼。
$ curl https://bob:12345@google.com/login
上面命令能夠識別 URL 里面的用戶名和密碼,將其轉為上個例子里面的 HTTP 標頭。
$ curl -u 'bob' https://google.com/login
上面命令只設置了用戶名,執行后,curl 會提示用戶輸入密碼。
-v
-v參數輸出通信的整個過程,用於調試。
$ curl -v https://www.example.com
--trace參數也可以用於調試,還會輸出原始的二進制數據。
$ curl --trace - https://www.example.com
-x
-x參數指定 HTTP 請求的代理。
$ curl -x socks5://james:cats@myproxy.com:8080 https://www.example.com
上面命令指定 HTTP 請求通過myproxy.com:8080的 socks5 代理發出。
如果沒有指定代理協議,默認為 HTTP。
$ curl -x james:cats@myproxy.com:8080 https://www.example.com
上面命令中,請求的代理使用 HTTP 協議。
-X
-X參數指定 HTTP 請求的方法。
$ curl -X POST https://www.example.com
上面命令對https://www.example.com發出 POST 請求。
CURL狀態碼列表 |
||
狀態碼 |
狀態原因 |
解釋 |
0 |
正常訪問 |
|
1 |
錯誤的協議 |
未支持的協議。此版cURL 不支持這一協議。 |
2 |
初始化代碼失敗 |
初始化失敗。 |
3 |
URL格式不正確 |
URL 格式錯誤。語法不正確。 |
4 |
請求協議錯誤 |
|
5 |
無法解析代理 |
無法解析代理。無法解析給定代理主機。 |
6 |
無法解析主機地址 |
無法解析主機。無法解析給定的遠程主機。 |
7 |
無法連接到主機 |
無法連接到主機。 |
8 |
遠程服務器不可用 |
FTP 非正常的服務器應答。cURL 無法解析服務器發送的數據。 |
9 |
訪問資源錯誤 |
FTP 訪問被拒絕。服務器拒絕登入或無法獲取您想要的特定資源或目錄。最有可 |
11 |
FTP密碼錯誤 |
FTP 非正常的PASS 回復。cURL 無法解析發送到PASS 請求的應答。 |
13 |
結果錯誤 |
FTP 非正常的的PASV 應答,cURL 無法解析發送到PASV 請求的應答。 |
14 |
FTP回應PASV命令 |
FTP 非正常的227格式。cURL 無法解析服務器發送的227行。 |
15 |
內部故障 |
FTP 無法連接到主機。無法解析在227行中獲取的主機IP。 |
17 |
設置傳輸模式為二進制 |
FTP 無法設定為二進制傳輸。無法改變傳輸方式到二進制。 |
18 |
文件傳輸短或大於預期 |
部分文件。只有部分文件被傳輸。 |
19 |
RETR命令傳輸完成 |
FTP 不能下載/訪問給定的文件, RETR (或類似)命令失敗。 |
21 |
命令成功完成 |
FTP quote 錯誤。quote 命令從服務器返回錯誤。 |
22 |
返回正常 |
HTTP 找不到網頁。找不到所請求的URL 或返回另一個HTTP 400或以上錯誤。 |
23 |
數據寫入失敗 |
寫入錯誤。cURL 無法向本地文件系統或類似目的寫入數據。 |
25 |
無法啟動上傳 |
FTP 無法STOR 文件。服務器拒絕了用於FTP 上傳的STOR 操作。 |
26 |
回調錯誤 |
讀錯誤。各類讀取問題。 |
27 |
內存分配請求失敗 |
內存不足。內存分配請求失敗。 |
28 |
訪問超時 |
操作超時。到達指定的超時期限條件。 |
30 |
FTP端口錯誤 |
FTP PORT 失敗。PORT 命令失敗。並非所有的FTP 服務器支持PORT 命令,請 |
31 |
FTP錯誤 |
FTP 無法使用REST 命令。REST 命令失敗。此命令用來恢復的FTP 傳輸。 |
33 |
不支持請求 |
HTTP range 錯誤。range "命令"不起作用。 |
34 |
內部發生錯誤 |
HTTP POST 錯誤。內部POST 請求產生錯誤。 |
35 |
SSL/TLS握手失敗 |
SSL 連接錯誤。SSL 握手失敗。 |
36 |
下載無法恢復 |
FTP 續傳損壞。不能繼續早些時候被中止的下載。 |
37 |
文件權限錯誤 |
文件無法讀取。無法打開文件。權限問題? |
38 |
LDAP可沒有約束力 |
LDAP 無法綁定。LDAP 綁定(bind)操作失敗。 |
39 |
LDAP搜索失敗 |
LDAP 搜索失敗。 |
41 |
函數沒有找到 |
功能無法找到。無法找到必要的LDAP 功能。 |
42 |
中止的回調 |
由回調終止。應用程序告知cURL 終止運作。 |
43 |
內部錯誤 |
內部錯誤。由一個不正確參數調用了功能。 |
45 |
接口錯誤 |
接口錯誤。指定的外發接口無法使用。 |
47 |
過多的重定向 |
過多的重定向。cURL 達到了跟隨重定向設定的最大限額跟 |
48 |
無法識別選項 |
指定了未知TELNET 選項。 |
49 |
TELNET格式錯誤 |
不合式的telnet 選項。 |
51 |
遠程服務器的SSL證書 |
peer 的SSL 證書或SSH 的MD5指紋沒有確定。 |
52 |
服務器無返回內容 |
服務器無任何應答,該情況在此處被認為是一個錯誤。 |
53 |
加密引擎未找到 |
找不到SSL 加密引擎。 |
54 |
設定默認SSL加密失敗 |
無法將SSL 加密引擎設置為默認。 |
55 |
無法發送網絡數據 |
發送網絡數據失敗。 |
56 |
衰竭接收網絡數據 |
在接收網絡數據時失敗。 |
57 |
||
58 |
本地客戶端證書 |
本地證書有問題。 |
59 |
無法使用密碼 |
無法使用指定的SSL 密碼。 |
60 |
憑證無法驗證 |
peer 證書無法被已知的CA 證書驗證。 |
61 |
無法識別的傳輸編碼 |
無法辨識的傳輸編碼。 |
62 |
無效的LDAP URL |
無效的LDAP URL。 |
63 |
文件超過最大大小 |
超過最大文件尺寸。 |
64 |
FTP失敗 |
要求的FTP 的SSL 水平失敗。 |
65 |
倒帶操作失敗 |
發送此數據需要的回卷(rewind)失敗。 |
66 |
SSL引擎失敗 |
初始化SSL 引擎失敗。 |
67 |
服務器拒絕登錄 |
用戶名、密碼或類似的信息未被接受,cURL 登錄失敗。 |
68 |
未找到文件 |
在TFTP 服務器上找不到文件。 |
69 |
無權限 |
TFTP 服務器權限有問題。 |
70 |
超出服務器磁盤空間 |
TFTP 服務器磁盤空間不足。 |
71 |
非法TFTP操作 |
非法的TFTP 操作。 |
72 |
未知TFTP傳輸的ID |
未知TFTP 傳輸編號(ID)。 |
73 |
文件已經存在 |
文件已存在(TFTP) 。 |
74 |
錯誤TFTP服務器 |
無此用戶(TFTP) 。 |
75 |
字符轉換失敗 |
字符轉換失敗。 |
76 |
必須記錄回調 |
需要字符轉換功能。 |
77 |
CA證書權限 |
讀SSL 證書出現問題(路徑?訪問權限? ) 。 |
78 |
URL中引用資源不存在 |
URL 中引用的資源不存在。 |
79 |
錯誤發生在SSH會話 |
SSH 會話期間發生一個未知錯誤。 |
80 |
無法關閉SSL連接 |
未能關閉SSL 連接。 |
81 |
服務未准備 |
|
82 |
無法載入CRL文件 |
無法加載CRL 文件,丟失或格式不正確(在7.19.0版中增加) 。 |
83 |
發行人檢查失敗 |
簽發檢查失敗(在7.19.0版中增加) 。 |