Linux之curl


 簡介

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或以上錯誤。
此返回代碼只出現在使用了-f/--fail 選項以后。

23

數據寫入失敗

寫入錯誤。cURL 無法向本地文件系統或類似目的寫入數據。

25

無法啟動上傳

FTP 無法STOR 文件。服務器拒絕了用於FTP 上傳的STOR 操作。

26

回調錯誤

讀錯誤。各類讀取問題。

27

內存分配請求失敗

內存不足。內存分配請求失敗。

28

訪問超時

操作超時。到達指定的超時期限條件。

30

FTP端口錯誤

FTP PORT 失敗。PORT 命令失敗。並非所有的FTP 服務器支持PORT 命令,請
嘗試使用被動(PASV)傳輸代替!

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版中增加) 。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM