簡介
首先需要了解的是,curl命令是一個網絡工具,其主要作用是通過http、ftp等方式下載文件,也能夠上傳文件,作爲一個功能強大的網絡工具,curl命令同時支持HTTPS等衆多協議,還支持POST、cookies、認證、從指定偏移處下載部分文件、用戶代理字符串、限速、文件大小、進度條等特徵。
資料拓展:cURL是一個利用URL語法在命令行下工作的文件傳輸工具,1997年首次發行。它支持文件上傳和下載,所以是綜合傳輸工具,但按傳統,習慣稱cURL爲下載工具。cURL還包含了用於程序開發的libcurl。
cURL支持的通信協議有FTP、FTPS、HTTP、HTTPS、TFTP、SFTP、Gopher、SCP、Telnet、DICT、FILE、LDAP、LDAPS、IMAP、POP3、SMTP和RTSP。
它的功能非常強大,命令行參數多達幾十種。如果熟練的話,完全可以取代 Postman 這一類的圖形界面工具。
參數
語法:# curl [option] [url]
常見參數:
-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 進度條顯示當前的傳送狀態
常見用法示例
不帶有任何參數時,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。
-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 '[email protected]' https://google.com/profile
上面命令會給 HTTP 請求加上標頭Content-Type: multipart/form-data,然後將文件photo.png作爲file字段上傳。
-F參數還可以指定 MIME 類型。
$ curl -F '[email protected];type=image/png' https://google.com/profile
上面命令指定 MIME 類型爲image/png,否則 curl 會把 MIME 類型設爲application/octet-stream。
-F參數也可以指定文件名。
$ curl -F '[email protected];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 字節。
-o
-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 請求。
其他參數
-a/--append 上傳文件時,附加到目標文件
--anyauth 可以使用“任何”身份驗證方法
--basic 使用HTTP基本驗證
-B/--use-ascii 使用ASCII文本傳輸
-d/--data <data> HTTP POST方式傳送數據
--data-ascii <data> 以ascii的方式post數據
--data-binary <data> 以二進制的方式post數據
--negotiate 使用HTTP身份驗證
--digest 使用數字身份驗證
--disable-eprt 禁止使用EPRT或LPRT
--disable-epsv 禁止使用EPSV
--egd-file <file> 爲隨機數據(SSL)設置EGD socket路徑
--tcp-nodelay 使用TCP_NODELAY選項
-E/--cert <cert[:passwd]> 客戶端證書文件和密碼 (SSL)
--cert-type <type> 證書文件類型 (DER/PEM/ENG) (SSL)
--key <key> 私鑰文件名 (SSL)
--key-type <type> 私鑰文件類型 (DER/PEM/ENG) (SSL)
--pass <pass> 私鑰密碼 (SSL)
--engine <eng> 加密引擎使用 (SSL). "--engine list" for list
--cacert <file> CA證書 (SSL)
--capath <directory> CA目 (made using c_rehash) to verify peer against (SSL)
--ciphers <list> SSL密碼
--compressed 要求返回是壓縮的形勢 (using deflate or gzip)
--connect-timeout <seconds> 設置最大請求時間
--create-dirs 建立本地目錄的目錄層次結構
--crlf 上傳是把LF轉變成CRLF
--ftp-create-dirs 如果遠程目錄不存在,創建遠程目錄
--ftp-method [multicwd/nocwd/singlecwd] 控制CWD的使用
--ftp-pasv 使用 PASV/EPSV 代替端口
--ftp-skip-pasv-ip 使用PASV的時候,忽略該IP地址
--ftp-ssl 嘗試用 SSL/TLS 來進行ftp數據傳輸
--ftp-ssl-reqd 要求用 SSL/TLS 來進行ftp數據傳輸
-F/--form <name=content> 模擬http表單提交數據
-form-string <name=string> 模擬http表單提交數據
-g/--globoff 禁用網址序列和範圍使用{}和[]
-G/--get 以get的方式來發送數據
-h/--help 幫助
-H/--header <line> 自定義頭信息傳遞給服務器
--ignore-content-length 忽略的HTTP頭信息的長度
-i/--include 輸出時包括protocol頭信息
-I/--head 只顯示文檔信息
-j/--junk-session-cookies 讀取文件時忽略session cookie
--interface <interface> 使用指定網絡接口/地址
--krb4 <level> 使用指定安全級別的krb4
-k/--insecure 允許不使用證書到SSL站點
-K/--config 指定的配置文件讀取
-l/--list-only 列出ftp目錄下的文件名稱
--limit-rate <rate> 設置傳輸速度
--local-port<NUM> 強制使用本地端口號
-m/--max-time <seconds> 設置最大傳輸時間
--max-redirs <num> 設置最大讀取的目錄數
--max-filesize <bytes> 設置最大下載的文件總量
-M/--manual 顯示全手動
-n/--netrc 從netrc文件中讀取用戶名和密碼
--netrc-optional 使用 .netrc 或者 URL來覆蓋-n
--ntlm 使用 HTTP NTLM 身份驗證
-N/--no-buffer 禁用緩衝輸出
-p/--proxytunnel 使用HTTP代理
--proxy-anyauth 選擇任一代理身份驗證方法
--proxy-basic 在代理上使用基本身份驗證
--proxy-digest 在代理上使用數字身份驗證
--proxy-ntlm 在代理上使用ntlm身份驗證
-P/--ftp-port <address> 使用端口地址,而不是使用PASV
-Q/--quote <cmd> 文件傳輸前,發送命令到服務器
--range-file 讀取(SSL)的隨機文件
-R/--remote-time 在本地生成文件時,保留遠程文件時間
--retry <num> 傳輸出現問題時,重試的次數
--retry-delay <seconds> 傳輸出現問題時,設置重試間隔時間
--retry-max-time <seconds> 傳輸出現問題時,設置最大重試時間
-S/--show-error 顯示錯誤
--socks4 <host[:port]> 用socks4代理給定主機和端口
--socks5 <host[:port]> 用socks5代理給定主機和端口
-t/--telnet-option <OPT=val> Telnet選項設置
--trace <file> 對指定文件進行debug
--trace-ascii <file> Like --跟蹤但沒有hex輸出
--trace-time 跟蹤/詳細輸出時,添加時間戳
--url <URL> Spet URL to work with
-U/--proxy-user <user[:password]> 設置代理用戶名和密碼
-V/--version 顯示版本信息
-X/--request <command> 指定什麼命令
-y/--speed-time 放棄限速所要的時間。默認爲30
-Y/--speed-limit 停止傳輸速度的限制,速度時間'秒
-z/--time-cond 傳送時間設置
-0/--http1.0 使用HTTP 1.0
-1/--tlsv1 使用TLSv1(SSL)
-2/--sslv2 使用SSLv2的(SSL)
-3/--sslv3 使用的SSLv3(SSL)
--3p-quote like -Q for the source URL for 3rd party transfer
--3p-url 使用url,進行第三方傳送
--3p-user 使用用戶名和密碼,進行第三方傳送
-4/--ipv4 使用IP4
-6/--ipv6 使用IP6