1. 程式人生 > 其它 >Linux curl命令詳解

Linux curl命令詳解

技術標籤:架構

curl是一個非常實用的、用來與伺服器之間傳輸資料的工具;支援的協議包括 (DICT, FILE, FTP, FTPS, GOPHER, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, TELNET and TFTP),curl設計為無使用者互動下完成工作;
curl提供了一大堆非常有用的功能,包括代理訪問、使用者認證、ftp上傳下載、HTTP POST、SSL連線、cookie支援、斷點續傳…。

一、curl命令語法

curl [options]
[URL...]

二、curl命令引數詳解

由於linux curl功能十分強大,所以命令引數十分多,下表只是愛E族(aiezu.com)帥選出來的部分引數,更多引數請執行“man curl”命令檢視。

引數組引數描述
urlurl需要抓取的一到多個URLs;
多個下面萬用字元的方式:
  1、http://{www,ftp,mail}.aiezu.com;
  2、http://aiezu.com/images/[001-999].jpg;
  3、http://aiezu.com/images/[1-999].html;
  4、ftp://aiezu.com/file[a-z].txt


-H "name: value"
--header "name: value"
(HTTP)新增一個http header(http請求頭);
-H "name:"
--header "name:"
(HTTP)移除一個http header(http請求頭);
-A "string"
--user-agent "string"
【參考】
(HTTP)設定Http請求頭“User-Agent”,伺服器通過“User-Agent”可以判斷客戶端使用的瀏覽器名稱和作業系統型別,偽造此引數能導致伺服器做出錯誤判斷。
也可以使用“-H”, “--header option”設定此選項;
-e<URL>
--referer <URL>
【參考】
(HTTP)設定訪問時的來源頁面,告訴http服務從哪個頁面進入到此頁面;
-e "aiezu.com"相當於“-H "Referer: www.qq.com"”;


-I
--head
(HTTP)只輸出HTTP-header,不獲取內容(HTTP/FTP/FILE)。
用於HTTP服務時,獲取頁面的http頭;
(如:curl -I http://aiezu.com)
用於FTP/FILE時,將會獲取檔案大小、最後修改時間;
(如:curl -I file://test.txt)
-i
--include
(HTTP)輸出HTTP頭和返回內容;
-D<file>
--dump-header <file>
(HTTP)轉儲http響應頭到指定檔案;
cookie-b name=data
--cookie name=data
【參考】
(HTTP)傳送cookie資料到HTTP伺服器,資料格式為:"NAME1=VALUE1; NAME2=VALUE2";

如果行中沒有“=”,將把引數值當作cookie檔名;

這個cookie資料可以是由伺服器的http響應頭“Set-Cookie:”行傳送過來的;
-c filename
--cookie-jar file name
【參考】
(HTTP)完成操作後將伺服器返回的cookies儲存到指定的檔案;
指定引數值為“-”將定向到標準輸出“如控制檯”;
-j
--junk-session-cookies
(HTTP)告訴curl放棄所有的"session cookies";
相當於重啟瀏覽器;
代理-x host:port
-x [protocol://[user:[email protected]]host[:port]
--proxy [protocol://[user:[email protected]]host[:port]
【參考】
使用HTTP代理訪問;如果未指定埠,預設使用8080埠;
protocol預設為http_proxy,其他可能的值包括:
http_proxy、HTTPS_PROXY、socks4、socks4a、socks5;
如:
--proxy 8.8.8.8:8080;
-x "http_proxy://aiezu:[email protected]:80"
-p
--proxytunnel
將“-x”引數的代理,作為通道的方式去代理非HTTP協議,如ftp;
--socks4 <host[:port]>
--socks4a <host[:port]>
--socks5 <host[:port]>
【參考】
使用SOCKS4代理;
使用SOCKS4A代理;
使用SOCKS5代理;
此引數會覆蓋“-x”引數;
--proxy-anyauth
--proxy-basic
--proxy-diges
--proxy-negotiate
--proxy-ntlm
http代理認證方式,參考:
--anyauth
--basic
--diges
--negotiate
--ntlm
-U<user:password>
--proxy-user <user:password>
設定代理的使用者名稱和密碼;
資料
傳輸
-G
--get
【參考】
如果使用了此引數,“-d/”、“--data”、“--data-binary”引數設定的資料,講附加在url上,以GET的方式請求;
-d @file
-d "string"
--data "string"
--data-ascii "string"
--data-binary "string"
--data-urlencode "string"
【參考】
(HTTP)使用HTTP POST方式傳送“key/value對”資料,相當於瀏覽器表單屬性(method="POST",enctype="application/x-www-form-urlencoded")
  -d,--data:HTTP方式POST資料;
  --data-ascii:HTTP方式POST ascii資料;
  --data-binary:HTTP方式POST二進位制資料;
  --data-urlencode:HTTP方式POST資料(進行urlencode);
如果資料以“@”開頭,後緊跟一個檔案,將post檔案內的內容;
-F [email protected]
-F name=<file
-F name=content
--form name=content
【參考】
(HTTP)使用HTTP POST方式傳送類似“表單欄位”的多型別資料,相當於同時設定瀏覽器表單屬性(method="POST",enctype="multipart/form-data"),可以使用此引數上傳二進位制檔案。

如果欄位內容以“@”開頭,剩下的部分應該是檔名,curl將會上傳此檔案,如:
curl -F "[email protected]" http://aiezu.com;
curl -F "[email protected];type=text/html" http://aiezu.com
curl -F "[email protected]/tmp/a;filename=a.txt" http://aiezu.com

如果欄位內容以“<”開頭,剩下的部分應該是檔名,curl將從檔案中獲取作為此欄位的值,如:curl -F "text=<text.txt" http://aiezu.com;
--form-string <key=value>(HTTP)類似於“--form”,但是“@”、“<”無特殊含義;
-T file
--upload-file file
通過“put”的方式將檔案傳輸到遠端網址;

選項引數只使用字元"-",將通過stdin讀入檔案內容;
如:
cat test.txt|curl "http://aiezu.com/a.php" -T -
curl "http://aiezu.com/a.php" -T - <test.txt

此引數也可以使用萬用字元:
curl -T "{file1,file2}" http://aiezu.com
curl -T "img[1-1000].png" http://aiezu.com
斷點
續傳
-C<offset>
--continue-at<offset>
斷點續轉,從檔案頭的指定位置開始繼續下載/上傳;
offset續傳開始的位置,如果offset值為“-”,curl會自動從檔案中識別起始位置開始傳輸;
-r<range>
--range <range>
(HTTP/FTP/SFTP/FILE) 只傳輸內容的指定部分:
0-499:最前面500位元組;
-500:最後面500位元組;
9500-:最前面9500位元組;
0-0,-1:最前面和最後面的1位元組;
100-199,500-599:兩個100位元組;



認證
--basic(HTTP)告訴curl使用HTTP Basic authentication(HTTP協議時),這是預設認證方式;
--ntlm(HTTP)使用NTLM身份驗證方式,用於HTTP協議;
一般用於IIS使用NTLM的網站;
--digest(HTTP)使用HTTP Digest authentication加密,用於HTTP協議;
配合“-u/--user”選項,防止密碼使用明文方式傳送;
--negotiate(HTTP)使用GSS-Negotiate authentication方式,用於HTTP協議;
它主要目的是為它的主要目的是為kerberos5認證提供支援支援;
--anyauth(HTTP)告訴curl自動選擇合適的身份認證方法,並選用最安全的方式;
-u user:password
--user user:password
使用使用者名稱、密碼認證,此引數會覆蓋“-n”、“--netrc”和“--netrc-optional”選項;

如果你只提供使用者名稱,curl將要求你輸入密碼;

如果你使用“SSPI”開啟的curl庫做“NTLM”認證,可以使用不含使用者名稱密碼的“-u:”選項,強制curl使用當前登入的使用者名稱密碼進行認證;

此引數相當於設定http頭“Authorization:”;
證書-E<證書[:密碼]>
--cert<證書[:密碼]>
(SSL)指定“PEM”格式的證書檔案和證書密碼;
--cert-type <type>(SSL)告訴curl所提供證書的型別:PEM、DER、ENG等;
預設為“PEM”;
--cacert <CA證書>(SSL)告訴curl所以指定的CA證書檔案,必須是“PEM”格式;
--capath <CA證書路徑>(SSL)告訴curl所以指定目錄下的CA證書用來驗證;
這些證書必須是“PEM”格式;
--crlfile <file>(HTTPS/FTPS)提供一個PEM格式的檔案,用於指定被吊銷的證書列表;
-k
--insecure
(SSL)設定此選項將允許使用無證書的不安全SSL進行連線和傳輸。
SSL
其他
--ciphers <list of ciphers>(SSL)指定SSL要使用的加密方式;如:“aes_256_sha_256”;
--engine <name>設定一個OpenSSL加密引擎用於加密操作;
使用“curl --engine list”檢視支援的加密引擎列表;
--random-file(SSL)指定包含隨機資料的檔案路徑名;資料是用來為SSL連線產生隨機種子為;
--egd-file<file>(SSL)為隨機種子生成器EGD(Entropy Gathering Daemon socket)指定的路徑名;
-1/--tlsv1
--tlsv1.0
--tlsv1.1
--tlsv1.2
-2/--sslv2
-3/--sslv3
(SSL)使用TLS版本2與遠端伺服器通訊;
(SSL)使用TLS 1.0版本與遠端伺服器通訊;
(SSL)使用TLS 1.1版本與遠端伺服器通訊;
(SSL)使用TLS 1.2版本與遠端伺服器通訊;
(SSL)使用SSL版本2與遠端伺服器通訊;
(SSL)使用SSL版本3與遠端伺服器通訊;
私鑰
公鑰
--key <key>(SSL/SSH)指定一個私鑰檔名;為指定時自動嘗試使用下面檔案:“~/.ssh/id_rsa”、“~/.ssh/id_dsa”、“./id_rsa'”、 “./id_dsa”;
--key-type <type>(SSL)指定私鑰檔案型別,支援:DER、PEM、ENG,預設是PEM;
--pass<phrase>(SSL/SSH)指定私鑰檔案的密碼;
--pubkey <key>(SSH)使用指定檔案提供的您公鑰;
FTP-P
--ftp-port <介面>
(FTP)FTP主動模式時,設定一個地址等待伺服器的連線,如:
網絡卡:eth1
IP:8.8.8.8
主機名:aiezu.com
可以加埠號:eth1:20000-21000;
--crlf(FTP)上傳時將換行符(LF)轉換為回車換行(CRLF);
--ftp-account [data](FTP)ftp帳號資訊;
--ftp-method [method](FTP)可選值:multicwd/nocwd/singlecwd;
--ftp-pasv(FTP)使用使用PASV(被動)/EPSV模式;
--ftp-skip-pasv-ip(FTP)使用PASV的時,跳過指定IP;
--ftp-create-dirs(FTP)上傳時自動建立遠端目錄;
-l
--list-only
(FTP)列出ftp檔案列表;
-B
--use-ascii
(FTP/LDAP)使用Ascii傳輸模式,用於FTP、LDAP;在ftp中相當與使用了“type=A;”模式。
--disable-epsv(FTP)告訴curl在PASV(被動模式)時不要使用EPSV;
--disable-eprt(FTP)告訴curl在主動模式時禁用EPRT和LPRT;
限速--limit-rate<speed>限制curl使用的最大頻寬;如果未指定單位,預設單位為“bytes/秒”,你也可以指定單位為“K”、“M”、“G”等單位,如:“--limit-rate 1m”為限制最大使用頻寬為“1m位元組/秒”;
-y
--speed-time <time>
If a download is slower than speed-limit bytes per second during a speed-time period, the download gets aborted. If speed-time is used, the default speed-limit will be 1 unless set with -Y.
This option controls transfers and thus will not affect slow connects etc. If this is a concern for you, try the--connect-timeoutoption.
-Y
--speed-limit <speed>
If a download is slower than this given speed (in bytes per second) for speed-time seconds it gets aborted. speed-time is set with -y and is 30 if not set.
其他
選項
-0/--http1.0(HTTP) 強制curl使用HTTP 1.0而不是使用預設的HTTP 1.1;
--interface <name>使用指定的網絡卡介面訪問;
curl --interface eth0 http://aiezu.com
curl --interface 10.0.0.101 http://aiezu.com
-X<command>
--request <command>
(HTTP)指定與伺服器通訊使用的請求方法,如:GET、PUT、POST、DELETE等,預設GET;
--keepalive-time <seconds>設定keepalive時間
--no-keepalive關閉keepalive功能;
--no-buffer禁用對輸出流緩衝;
--buffer啟用輸出流緩衝;
-L
--location
(HTTP/HTTPS)追隨http響應頭“Location:”定向到跳轉後的頁面;
(在http響應碼為3XX時使用,如301跳轉、302跳轉)
--location-trusted(HTTP/HTTPS)同“--location”,但跳轉後會傳送跳轉前的使用者名稱和密碼;
--compressed(HTTP)請求對返回內容使用壓縮演算法進行壓縮;curl支援對gzip壓縮排行解壓;
--connect-timeout <seconds>指定最大連線超時,單位“秒”;
-m seconds
--max-time seconds
限制整個curl操作的最長時間,單位為秒;
-s
--silent
安靜模式。不要顯示進度表或錯誤訊息;
-#
--progress-bar
顯示進度條;
錯誤
選項
-f
--fail
(HTTP)連線失敗時(400以上錯誤)不返回預設錯誤頁面,而是返回一個curl錯誤碼“22”;
--retry <num>
--retry-delay <seconds>
--retry-max-time<seconds>
失敗重試次數;
重試間隔時間;
最大重試時間;
-S
--show-error
安靜模式下顯示錯誤資訊;
--stderr <file>錯誤資訊儲存檔案;
輸出-o file
--output file
將返回內容輸出到檔案。
如果是用過萬用字元獲取多個url,可以使用“#”後跟“數字序號”,curl會自動將它替換對應的關鍵詞,如:
  curl "http://aiezu.com/{a,b}.txt" -o "#1.txt";
  將儲存為:“a.txt”,“b.txt”;

  curl "http://aiezu.com/{a,b}_[1-3].txt" -o "#1#2.txt";
  將儲存為:a1.txt、a2.txt、a3.txt、b1.txt、b2.txt、b3.txt

  如果要根據規則建立儲存目錄,參考:“--create-dirs”

指定“-”將定向到標準輸出“如控制檯”;
-O
--remote-name
將返回內容輸出到當前目錄下,和url中檔名相同的檔案中(不含目錄);
--create-dirs與“-o”引數配合使用,建立必要的本地目錄層次結構
-w
--write-out format
操作完成後在返回資訊尾部追加指定的內容;要追加的內容可以是一個字串“string”、從檔案中獲取“@filename”、從標準輸入中獲取“@-”

格式引數中可以用%{variable_name} 方式使用響應資訊的相關變數,如:%{content_type}、%{http_code}、%{local_ip}...,更多變數參考“man curl”獲取;

格式引數可以使用“\n”、“\r”、“\t”等轉義字元;
除錯--trace <file>轉儲所有傳入和傳出的資料到檔案,包括描述資訊;
使用“-”作為檔名將輸出傳送到標準輸出。
--trace-ascii file轉儲所有傳入和傳出的資料到檔案,包括描述資訊,只轉儲ASCII部分,更容易閱讀;
使用“-”作為檔名將輸出傳送到標準輸出。
這個選項會覆蓋之前使用的-v、 --verbose、 --trace-ascii選項;
--trace-time轉儲檔案中新增時間資訊;
-K
--config <config file>
從配置檔案中讀取引數,參考:http://curl.haxx.se/docs/
-v
--verbose
顯示更詳細的資訊,除錯時使用;
幫助-M
--manual
顯示完整的幫助手冊;
-h
--help
linux curl用法幫助;

三、Linux curl命令退出碼

下面是linux curl命令的錯誤程式碼和她們的相應的錯誤訊息,可能會出現在惡劣的環境。

退出碼錯誤描述
1Unsupported protocol. This build of curl has no support for this protocol.
2Failed to initialize.
3URL malformed. The syntax was not correct.
5Couldn't resolve proxy. The given proxy host could not be resolved.
6Couldn't resolve host. The given remote host was not resolved.
7Failed to connect to host.
8FTP weird server reply. The server sent data curl couldn't parse.
9FTP access denied. The server denied login or denied access to the particular resource or directory you wanted to reach. Most often you tried to change to a directory that doesn't exist on the server.
11FTP weird PASS reply. Curl couldn't parse the reply sent to the PASS request.
13FTP weird PASV reply, Curl couldn't parse the reply sent to the PASV request.
14FTP weird 227 format. Curl couldn't parse the 227-line the server sent.
15FTP can't get host. Couldn't resolve the host IP we got in the 227-line.
17FTP couldn't set binary. Couldn't change transfer method to binary.
18Partial file. Only a part of the file was transferred.
19FTP couldn't download/access the given file, the RETR (or similar) command failed.
21FTP quote error. A quote command returned error from the server.
22HTTP page not retrieved. The requested url was not found or returned another error with the HTTP error code being 400 or above. This return code only appears if -f/--fail is used.
23Write error. Curl couldn't write data to a local filesystem or similar.
25FTP couldn't STOR file. The server denied the STOR operation, used for FTP uploading.
26Read error. Various reading problems.
27Out of memory. A memory allocation request failed.
28Operation timeout. The specified time-out period was reached according to the conditions.
30FTP PORT failed. The PORT command failed. Not all FTP servers support the PORT command, try doing a transfer using PASV instead!
31FTP couldn't use REST. The REST command failed. This command is used for resumed FTP transfers.
33HTTP range error. The range "command" didn't work.
34HTTP post error. Internal post-request generation error.
35SSL connect error. The SSL handshaking failed.
36FTP bad download resume. Couldn't continue an earlier aborted download.
37FILE couldn't read file. Failed to open the file. Permissions?
38LDAP cannot bind. LDAP bind operation failed.
39LDAP search failed.
41Function not found. A required LDAP function was not found.
42Aborted by callback. An application told curl to abort the operation.
43Internal error. A function was called with a bad parameter.
45Interface error. A specified outgoing interface could not be used.
47Too many redirects. When following redirects, curl hit the maximum amount.
48Unknown TELNET option specified.
49Malformed telnet option.
51The peer's SSL certificate or SSH MD5 fingerprint was not ok.
52The server didn't reply anything, which here is considered an error.
53SSL crypto engine not found.
54Cannot set SSL crypto engine as default.
55Failed sending network data.
56Failure in receiving network data.
58Problem with the local certificate.
59Couldn't use specified SSL cipher.
60Peer certificate cannot be authenticated with known CA certificates.
61Unrecognized transfer encoding.
62Invalid LDAP URL.
63Maximum file size exceeded.
64Requested FTP SSL level failed.
65Sending the data requires a rewind that failed.
66Failed to initialize SSL Engine.
67The user name, password, or similar was not accepted and curl failed to log in.
68File not found on TFTP server.
69Permission problem on TFTP server.
70Out of disk space on TFTP server.
71Illegal TFTP operation.
72Unknown TFTP transfer ID.
73File already exists (TFTP).
74No such user (TFTP).
75Character conversion failed.
76Character conversion functions required.
77Problem with reading the SSL CA cert (path? access rights?).
78The resource referenced in the URL does not exist.
79An unspecified error occurred during the SSH session.
80Failed to shut down the SSL connection.
82Could not load CRL file, missing or wrong format (added in 7.19.0).
83Issuer check failed (added in 7.19.0).
XXMore error codes will appear here in future releases. The existing ones are meant to never change.

四、用法演示

1、下載頁面:
curl -o index.html http://aiezu.com
2、下載檔案並顯示簡單進度條
curl -# -o centos6.8.iso http://mirrors.aliyun.com/centos/6.8/isos/x86_64/CentOS-6.8-x86_64-minimal.iso
3、斷點續傳:

#繼續完成上次終止的未完成的下載

curl -# -o centos6.8.iso -C - http://mirrors.aliyun.com/centos/6.8/isos/x86_64/CentOS-6.8-x86_64-minimal.iso
4、偽造來源頁面:

#告訴愛E族,我是從百度來的

curl -e http://baidu.com http://aiezu.com
5、偽造代理裝置:

#告訴愛E族,我是GOOGLE爬蟲蜘蛛(其實我是curl命令)

curl -A " Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" http://aiezu.com

#告訴愛E族,我用的是微信內建瀏覽器

curl -A "Mozilla/5.0 AppleWebKit/600 Mobile MicroMessenger/6.0" http://aiezu.com
6、http頭:

#看看本站的http頭是怎麼樣的

curl -I  http://aiezu.com

輸出:

HTTP/1.1 200 OK
Date: Fri, 25 Nov 2016 16:45:49 GMT
Server: Apache
Set-Cookie: rox__Session=abdrt8vesprhnpc3f63p1df7j4; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Vary: Accept-Encoding
Content-Type: text/html; charset=utf-8
7、設定http請求頭:
curl -H "Cache-Control:no-cache"  http://aiezu.com
8、傳送表單資料:
curl -F "[email protected]" -F "site=aiezu"  http://aiezu.com/
9、傳送cookie:
curl -b "domain=aiezu.com"  http://aiezu.com

參考文件:

轉載: http://aiezu.com/article/linux_curl_command.html
http://www.ruanyifeng.com/blog/2019/09/curl-reference.html