介紹
cURL是一個利用URL語法的文件傳輸工具,是基于libcurl的前端命令行工具。它支持很多協議:FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE 以及 LDAP。 它同樣支持HTTPS認證,HTTP POST方法, HTTP PUT方法, FTP上傳, kerberos認證, HTTP上傳, 代理服務器, cookies, 用戶名/密碼認證, 下載文件斷點續傳, 上載文件斷點續傳, http代理服務器管道( proxy tunneling), 甚至它還支持IPv6, socks5代理服務器,通過http代理服務器上傳文件到FTP服務器等等,功能十分強大。
除了使用curl命令行直接進行相關的網絡操作,你也可以自由地使用libcurl,它是用C語言編寫的,可以綁定到眾多的編程語言中,如C,C++,PHP,Python,Perl,Java等等。你可以很方便地利用libcurl,在程序中進行一些網絡傳輸工作,來代替一些語言的內置,使你的知識可重用。在Unix工作環境下,你可以用curl代替wget和ftp等工具,并能將這種學習經驗遷移到將來使用libcurl來完成一些自動化任務。
curl是瑞典curl組織開發的,可以通過http://curl.haxx.se/來獲取更詳細的信息和下載文件。
curl命令行工具使用
curl太強大了,只能對其HTTP的部分作一簡單的介紹,其他選項可以參見其附帶的手冊。它的后端庫的使用也非常方便,主要也是在選項設置上,跟命令行基本無異。
用法
curl [選項] [URL...]
URL 語法
URL語法是跟協議相關的,具體細節可參見RFC 3986
可以指定多個URLs或者部分URL地址,通過花括號{}進行分割:
http://site.{one,two,three}.com
或者用[]使用字母序:
ftp://ftp.numericals.com/file[1-100].txt
ftp://ftp.numericals.com/file[001-100].txt (有前導零)
ftp://ftp.letters.com/file[a-z]].txt
當前序列嵌套不被支持,但是還是可以使用下列的樣式:
http://any.org/archive[1996-1999]/vol[1-4]/part{a,b,c}.html
可以在命令行指定任意數量的URLs,它們將以指定的順序被取回。
從curl7.15.1開始指定可以范圍步長,所以可以得到第n個數或字母:
http://www.numericals.com/file[1-100:10].txt
http://www.letters.com/file[a-z:2].txt
如果使用了protocal://前綴,curl會將嘗試你想使用的協議。它默認使用HTTP,但是其他一些協議也常被用作主機名。比如說,以"ftp"打頭的主機名,curl會假定你想使用ftp協議。
Curl會嘗試對多文件傳輸使用重連接,可以使從同一服務器獲取很多文件時,不會進行多次的連接。這種做法改進了速度,當然這只會在同一命令行中指定的文件啟用,而不會在獨立的Curl調用時使用。
進度指示器
curl通常在操作時會顯示一個進度指示器,來指明當前的傳輸量,傳輸速度和預計的剩余時間等等。
但是,即然curl默認將數據顯示在終端,如果你調用curl進行操作,它會將數據打印到終端上,這時它會禁用掉進度指示器,否則這些會將輸出信息搞亂掉。
如果在進行HTTP的POST或PUT請求時,你想將輸出重定向到文件中,可以使用shell的重定向符(>),或者類似的-o[file]選項。
但是在FTP上傳并不會這樣,這些操作不會將數據插入到終端中。
如果想使用進度欄,而不是常規的指示器,那么-#會非常有幫助。
常用的HTTP選項
-A/--user-agent<agent string>
(HTTP)指定用戶代理字符串發送給HTTP服務器。如果這個字段沒有被設為"Mozilla/4.0",某些CGIs將不會正常工作。如果在字符串中存在空白字符,需要用單引號標識。這個字段值也可用-H/--header選項進行設置。
如果這選項被多次設置,最后的設置將起作用。
-b/--cookie<name=data>
(HTTP)將data作為cookie傳給HTTP服務器,這數據當然是在使用了"Set-Cookie:"后,先前從服務端接收到的。這數據應是"NAME1=VALUE1;NAME2=VALUE2"的格式。
如果沒有"="字符,它將會當作先前存儲cookie行的文件名,如果它能被匹配的話。使用這選項,也能激活"cookie parser",它使curl記錄傳入的cookies數據。將它與-L/--locaion選項組合將會更加便利。被讀取cookie的文件格式應當是文本HTTP頭或者Netscape/Mozilla cookie文件格式。
注意:被-b/--cookie指定的文件只能作為輸入使用。沒有cookie會存儲在這文件中。為了存儲cookie,應使用-c/--cookie-jar選項或者直接將HTTP頭輸出到文件中,用-D/--dump-header選項。這選項可以設置多次,但是只有最后一個起作用。
-connect-timeout<seconds>
以秒計的最大超時,用于進行服務器連接時。這只在連接階段起作用,一旦curl連接建立,這選項將不再起作用。
-c/--cookie-jar<file name>
指定在完成一系列操作后,需要將全部的cookie信息保存到哪個文件中。Curl會將先前讀取的cookie的信息和從服務器返回的信息一起保存。如果沒有cookie信息,則不會進行寫文件。cookie信息的文件將與Netscape cookie文件格式保存。如果文件名被設置為'-',則將cookie打印至終端。
注意:如果cookie-jar不能被創建寫入,整個curl操作也不會失改,甚至不會向你報告錯誤.使用-v將會得到警告顯示,但也只能在可能導致發生致命錯誤的情況才會顯示。
--create-dirs
這與-o選項配合使用,curl會在需要時建立本地文件夾結構。這選項會創建在-o選項中涉及到的文件夾。如果-o選項中的文件名沒有使用到文件夾,或者所需的文件夾已經存在,則不會有文件夾創建。
-D/--dump-header<file>
將協議頭寫到指定的文件中。當你想存儲HTTP站點發給你的數據時,這選項非常有用。在協議頭中的cookie將來可以用curl的另外調用來進行讀取,那就是-b/--cookie選項。但是-c/--cookie-jar選項將會是更好的存儲cookie信息的方法。
當使用FTP協議時,ftp服務器的應答信息將相應地當作成協議頭,然后被存儲。
-p/-proxytunnel
當HTTP代理被設置后(-x/--proxy),選項會使不是HTTP協議的傳輸試圖通過代理隧道,而不是表現得HTTP類似的操作形為。代理隧道的方法是通過HTTP服務器直接使用CONNECT請求,讓代理直接連接到curl隧道所請求的遠程端口號的方式來實現的。
-o/--output<file>
將輸出信息打印到文件中,而不是終端。可使用{}或者[]取回多個文檔,可在file指定格式中的'#'跟一數字,這樣這變量將會由取回的URL字符串所取代。如下:
curl http://{one,two}.site.com -o "file_#1.txt"
如果有多個變量,可以寫成下面的樣子:
curl http://{site.host}.host[1-5].com -o "#1_#2"
你可對任意數量的URL使用同樣多的這個選項
-x/--proxy<proxyhost[:port]>
使用指定的HTTP代理,如果端口號沒有被指定,默認為1080.
這選項會覆蓋環境變量中代理服務器的設置。如果環境變量中設置了代理,可將proxy設置為空字符串,來覆蓋環境變量中的設置。
注意:所有通過HTTP代理的操作都會自動轉化為HTTP協議。這意味著一些特定協議的操作將會變得無效。這不會有問題,如果在設置了-p/--proxytunnel選項來通過代理隧道進行操作。
簡單示例
獲取cppblog首頁,打印至終端
>curl http://www.shnenglu.com
重定向,保存到文件cppblog.html
>curl http://www.shnenglu.com
作用同上,使用選項
>curl -o baidu.html http://www.baidu.com
使用http代理,可指定IP和端口
>curl -x 202.127.98.43:80 -o baidu.html http:www.baidu.com
在訪問一些論壇時,常常要求啟用cookie,因為這些網站需要啟用cookie來記錄sessioin信息,這時需要選項-D,將cookie信息保存起來
>curl -o cpp.html -c len@cppblog.com[1].txt http://www.shnenglu.com
先前保存的cookie信息返回給網站,這通常會傳回你的一些用戶信息。
>curl -o cpp.html -c len@cppblog.com[2].txt -b len@cppblog.com[1].txt http://www.shnenglu.com
posted on 2008-06-21 16:33
len 閱讀(7176)
評論(1) 編輯 收藏 引用 所屬分類:
IT技術