複製鏈接
請複製以下鏈接發送給好友

curl

(文件傳輸工具)

鎖定
cURL是一個利用URL語法在命令行下工作的文件傳輸工具,1997年首次發行。它支持文件上傳和下載,所以是綜合傳輸工具,但按傳統,習慣稱cURL為下載工具。cURL還包含了用於程序開發的libcurl。
中文名
curl
外文名
curl(CommandLine Uniform Resource Locator)
類    別
用URL語法
作    用
文件傳輸
適用範圍
計算機

curl工具簡介

cURL是一個利用URL語法在命令行下工作的文件傳輸工具,1997年首次發行。它支持文件上傳和下載,所以是綜合傳輸工具,但按傳統,習慣稱cURL為下載工具。cURL還包含了用於程序開發的libcurl。
cURL支持的通信協議有FTPFTPSHTTPHTTPSTFTPSFTPGopherSCPTelnet、DICT、FILE、LDAP、LDAPS、IMAPPOP3SMTPRTSP
curl還支持SSL認證、HTTP POST、HTTP PUT、FTP上傳, HTTP form based upload、proxies、HTTP/2、cookies、用户名+密碼認證(Basic, Plain, Digest, CRAM-MD5, NTLM, Negotiate and Kerberos)、file transfer resume、proxy tunneling。 [1] 

curl設計方法

獲得頁面
使用命令:curl http://curl.haxx.se
這是最簡單的使用方法。用這個命令獲得了http://curl.haxx.se指向的頁面,同樣,如果這裏的URL指向的是一個文件或者一幅圖都可以直接下載到本地。如果下載的是HTML文檔,那麼缺省的將只顯示文件頭部,即HTML文檔的header。要全部顯示,請加參數 -i,要只顯示頭部,用參數 -I。任何時候,可以使用 -v 命令看curl是怎樣工作的,它向服務器發送的所有命令都會顯示出來。為了斷點續傳,可以使用-r參數來指定傳輸範圍。 [1] 
獲取表單
在WEB頁面設計中,form是很重要的元素。Form通常用來收集並向網站提交信息。提交信息的方法有兩種,GET方法和POST方法。先討論GET方法,例如在頁面中有這樣一段:
<form method="GET" action="junk.cgi">
<input type=text name="birthyear">
<input type=submit name=press value="OK">
</form>
那麼瀏覽器上會出現一個文本框和一個標為“OK”的按鈕。按下這個按鈕,表單就用GET方法向服務器提交文本框的數據。
例如原始頁面是在 www.hotmail. com/when/birth.html看到的,然後您在文本框中輸入1905,然後按OK按鈕,那麼瀏覽器的URL現在應該是:“www.hotmail. com/when/junk.cgi?birthyear=1905&press=OK”
對於這種網頁,curl可以直接處理,例如想獲取上面的網頁,只要輸入:
curl "www.hotmail. com/when/junk.cgi?birthyear=1905&press=OK"
就可以了。
表單用來提交信息的第二種方法叫做POST方法,POST方法和GET方法的區別在於GET方法使用的時候,瀏覽器中會產生目標URL,而POST不會。類似GET,這裏有一個網頁:
<form method="POST" action="junk.cgi">
<input type=text name="birthyear">
<input type=submit name=press value="OK">
</form>
瀏覽器上也會出現一個文本框和一個標為“OK”的按鈕。按下這個按鈕,表單用POST方法向服務器提交數據。
這時的URL是看不到的,因此需要使用特殊的方法來抓取這個頁面:
curl -d "birthyear=1905&press=OK" www.hotmail. com/when/junk.cgi
這個命令就可以做到。
1995年年末,RFC 1867定義了一種新的POST方法,用來上傳文件。主要用於把本地文件上傳到服務器。此時頁面是這樣寫的:
<form method="POST" enctype='multipart/form-data' action="upload.cgi">
<input type=file name=upload>
<input type=submit name=press value="OK">
</form>
對於這種頁面,curl的用法不同:
curl -F upload=@localfilename -F press=OK URL
這個命令的實質是將本地的文件用POST上傳到服務器。
有關POST還有不少用法,用户可以自己摸索。
使用PUT
HTTP協議文件上傳的標準方法是使用PUT,此時curl命令使用-T參數: [1] 
curl -T uploadfile www.uploadhttp. com/receive.cgi
有關認證
curl可以處理各種情況的認證頁面,例如下載用户名/密碼認證方式的頁面(在IE中通常是出現一個輸入用户名和密碼的輸入框):
curl -u name:password www.secrets. com
如果網絡是通過http代理服務器出去的,而代理服務器需要用户名和密碼,那麼輸入:
curl -U proxyuser:proxypassword http://curl.haxx. se
任何需要輸入用户名和密碼的時候,只在參數中指定用户名而空着密碼,curl可以交互式的讓用户輸入密碼。
引用
有些網絡資源訪問的時候必須經過另外一個網絡地址跳轉過去,這用術語來説是:referer,引用。
對於這種地址的資源,curl也可以下載:
curl -e http://curl.haxx. se daniel.haxx. se
指定用户端
有些網絡資源首先需要判斷用户使用的是什麼瀏覽器,符合標準了才能夠下載或者瀏覽。此時curl可以把自己“偽裝”成任何其他瀏覽器:
curl -A "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)" URL
這個指令表示curl偽裝成了IE5.0,用户平台是Windows 2000。(對方服務器是根據這個字串來判斷客户端的類型的,所以即使使用AIX也無所謂)。
使用:
curl -A "Mozilla/4.73 [en] (X11; U; Linux 2.2.15 i686)" URL
此時curl變成了Netscape,運行在PIII平台的Linux上了。
COOKIES
Cookie是服務器經常使用的一種記憶客户信息的方法。如果cookie被記錄在了文件中,那麼使用命令:
curl -b stored_cookies_in_file www.cookiesite. com
curl可以根據舊的cookie寫出新cookie併發送到網站:
curl -b cookies.txt -c newcookies.txt www.cookiesite. com
加密HTTP
如果是通過OpenSSL加密的https協議傳輸的網頁,curl可以直接訪問:
curl https://that.secure.server. com
http認證
如果是採用證書認證的http地址,證書在本地,那麼curl這樣使用: [1] 
curl -E mycert.pem https://that.secure.server. com

curl相關函數

PHP cURL 函數
PHP支持的由Daniel Stenberg創建的libcurl庫允許你與各種的服務器使用各種類型的協議進行連接和通訊。libcurl支持httphttpsftpgophertelnet、dict、fileldap協議。libcurl同時也支持HTTPS認證、HTTP POST、HTTP PUT、 FTP 上傳(這個也能通過PHP的FTP擴展完成)、HTTP 基於表單的上傳、代理、cookies和用户名+密碼的認證。
PHP中使用cURL實現Get和Post請求的方法這些函數在PHP 4.0.2中被引入。 [1]  以下包含了PHP cURL函數列表:
curl_close()
關閉一個cURL會話。
curl_copy_handle()
複製一個cURL句柄和它的所有選項。
curl_errno()
返回最後一次的錯誤號。
curl_error()
返回一個保護當前會話最近一次錯誤的字符串。
curl_escape()
返回轉義字符串,對給定的字符串進行URL編碼。
curl_exec()
執行一個cURL會話。
curl_file_create()
創建一個CURLFile對象。
curl_getinfo()
獲取一個cURL連接資源句柄的信息。
curl_init()
初始化一個cURL會話。
curl_multi_add_handle()
向curl批處理會話中添加單獨的curl句柄。
curl_multi_close()
關閉一組cURL句柄。
curl_multi_exec()
運行當前cURL句柄的子連接
curl_multi_getcontent()
如果設置了CURLOPT_RETURNTRANSFER,

則返回獲取的輸出的文本流。
curl_multi_info_read()
獲取當前解析的cURL的相關傳輸信息。
curl_multi_init()
返回一個新cURL批處理句柄。
curl_multi_remove_handle()
移除curl批處理句柄資源中的某個句柄資源。
curl_multi_select()
等待所有cURL批處理中的活動連接。
curl_multi_setopt()
設置一個批處理cURL傳輸選項。
curl_multi_strerror()
返回描述錯誤碼的字符串文本。
curl_pause()
暫停及恢復連接。
curl_reset()
重置libcurl的會話句柄的所有選項。
curl_setopt_array()
為cURL傳輸會話批量設置選項。
curl_setopt()
設置一個cURL傳輸選項。
curl_share_close()
關閉cURL共享句柄。
curl_share_init()
初始化cURL共享句柄。
curl_share_setopt()
設置一個共享句柄的cURL傳輸選項。
curl_strerror()
返回錯誤代碼的字符串描述。
curl_unescape()
解碼URL編碼後的字符串。
curl_version()
獲取cURL版本信息。
參考資料
  • 1.    Stenberg, Daniel (20 March 2015). "curl, 17 years old today". daniel.haxx.se. Retrieved 20 March 2015.