1. 程式人生 > 實用技巧 >[Linux/Bash/Shell]curl工具 [轉載]

[Linux/Bash/Shell]curl工具 [轉載]

1 參考文獻

2 簡述

curl(Client URL, Command Line URL Viewer) : 常用的命令列工具,用來請求 Web 伺服器(發出網路請求,然後得到和提取資料)
它的名字就是客戶端(client)的 URL 工具的意思。
它的功能非常強大,命令列引數多達幾十種。
如果熟練的話,完全可以取代 Postman 這一類的圖形介面工具。

3 使用示例

3.1 檢視/下載 網頁原始碼

  • 查閱 網頁原文內容 on Command
root# curl www.sina.com
  • 儲存/下載 指定URL的網頁 on FileSystem/Disk
    如果要把這個網頁儲存下來,可以使用-o引數(output),這就相當於使用wget命令了。
root#  curl -o [Dir/檔名] www.sina.com

3.2 自動跳轉

有的網址是自動跳轉的。使用-L引數,curl就會跳轉到新的網址。

root# curl -L www.sina.com

鍵入上面的命令,結果就自動跳轉為www.sina.com.cn。

3.3 顯示頭資訊

-i引數可以顯示http response的頭資訊,連同網頁程式碼一起。

root# curl -i www.sina.com

3.4 顯示通訊過程

-v引數可以顯示一次http通訊的整個過程,包括埠連線和http request頭資訊。

root# curl -v www.sina.com

如果覺得上面的資訊還不夠,那麼下面的命令可以檢視更詳細的通訊過程。

root# curl --trace output.txt www.sina.com

或者

root# curl --trace-ascii output.txt www.sina.com

執行後,請開啟output.txt檔案檢視。

3.5 傳送表單資訊

傳送表單資訊有GET和POST兩種方法。GET方法相對簡單,只要把資料附在網址後面就行。

  • GET
root# curl example.com/form.json?user=xxx&passwd=yyyy
  • POST
    POST方法必須把資料和網址分開,curl就要用到--data引數
root# curl -X POST --data "user=xxx&passwd=yyyy" example.com/form.json

如果你的資料沒有經過表單編碼,還可以讓curl為你編碼,引數是--data-urlencode

root# curl -X POST--data-urlencode "user=xxx&passwd=yyyy" example.com/form.json

3 HTTP動詞

curl預設的HTTP動詞是GET,使用-X引數可以支援其他動詞。

root# curl -X POST www.example.com

root# curl -X DELETE www.example.com

4 檔案上傳

假定檔案上傳的表單是下面這樣:

<form method="POST" enctype='multipart/form-data' action="upload.cgi">
      <input type=file name=upload>
      <input type=submit name=btn value="OK">
</form>

你可以用curl這樣上傳檔案:

root# curl --form upload=@localfilename --form btn=OK [URL]

5 Referer欄位

有時你需要在http request頭資訊中,提供一個referer欄位,表示你是從哪裡跳轉過來的。

root# curl --referer http://www.example.com http://www.example.com

6 案例講解

curl
-A "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" 
-e "http://post.html"
-d "2880[]=105&pid=2880&p=最佳&count=1&receipt=1&poll=投票" http://post.php
  • -A=--user-agent : User-Agent
  • -e=--referer : 來源網址
  • -d=--data : HTTP POST方式 傳送資料
## 7 curl引數全解
``` shell
-a/--append 上傳檔案時,附加到目標檔案
 -A/--user-agent <string>  設定使用者代理髮送給伺服器
 - anyauth   可以使用“任何”身份驗證方法
 -b/--cookie <name=string/file> cookie字串或檔案讀取位置
 - basic 使用HTTP基本驗證
 -B/--use-ascii 使用ASCII /文字傳輸
 -c/--cookie-jar <file> 操作結束後把cookie寫入到這個檔案中
 -C/--continue-at <offset>  斷點續轉
 -d/--data <data>   HTTP POST方式傳送資料
 --data-ascii <data>  以ascii的方式post資料
 --data-binary <data> 以二進位制的方式post資料
 --negotiate     使用HTTP身份驗證
 --digest        使用數字身份驗證
 --disable-eprt  禁止使用EPRT或LPRT
 --disable-epsv  禁止使用EPSV
 -D/--dump-header <file> 把header資訊寫入到該檔案中
 --egd-file <file> 為隨機資料(SSL)設定EGD socket路徑
 --tcp-nodelay   使用TCP_NODELAY選項
 -e/--referer 來源網址
 -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
 -f/--fail          連線失敗時不顯示http錯誤
 --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忽略會話Cookie
 - 介面<interface>指定網路介面/地址使用
 - krb4 <級別>啟用與指定的安全級別krb4
 -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 禁用緩衝輸出
 -o/--output 把輸出寫到該檔案中
 -O/--remote-name 把輸出寫到該檔案中,保留遠端檔案的檔名
 -p/--proxytunnel   使用HTTP代理
 --proxy-anyauth 選擇任一代理身份驗證方法
 --proxy-basic   在代理上使用基本身份驗證
 --proxy-digest  在代理上使用數字身份驗證
 --proxy-ntlm    在代理上使用ntlm身份驗證
 -P/--ftp-port <address> 使用埠地址,而不是使用PASV
 -Q/--quote <cmd>檔案傳輸前,傳送命令到伺服器
 -r/--range <range>檢索來自HTTP/1.1或FTP伺服器位元組範圍
 --range-file 讀取(SSL)的隨機檔案
 -R/--remote-time   在本地生成檔案時,保留遠端檔案時間
 --retry <num>   傳輸出現問題時,重試的次數
 --retry-delay <seconds>  傳輸出現問題時,設定重試間隔時間
 --retry-max-time <seconds> 傳輸出現問題時,設定最大重試時間
 -s/--silent靜音模式。不輸出任何東西
 -S/--show-error   顯示錯誤
 --socks4 <host[:port]> 用socks4代理給定主機和埠
 --socks5 <host[:port]> 用socks5代理給定主機和埠
 --stderr <file>
 -t/--telnet-option <OPT=val> Telnet選項設定
 --trace <file>  對指定檔案進行debug
 --trace-ascii <file> Like --跟蹤但沒有hex輸出
 --trace-time    跟蹤/詳細輸出時,新增時間戳
 -T/--upload-file <file> 上傳檔案
 --url <URL>     Spet URL to work with
 -u/--user <user[:password]>設定伺服器的使用者和密碼
 -U/--proxy-user <user[:password]>設定代理使用者名稱和密碼
 -v/--verbose
 -V/--version 顯示版本資訊
 -w/--write-out [format]什麼輸出完成後
 -x/--proxy <host[:port]>在給定的埠上使用HTTP代理
 -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
 -#/--progress-bar 用進度條顯示當前的傳送狀態