引言
curl 是一個軟件包,由命令行工具和使用URL語法傳輸數據的庫組成。
curl 支持多種協議,如DICT、FILE、FTP、FTPS、Gopher、HTTP、HTTPS、IMAP、IMAPS、LDAP、LDAPS、POP3、POP3S、RTMP、RTSP、SCP、SFTP、SMTP、SMTPS、Telnet和TFTP。
本文用實例深度演示 curl 的詳細用法。
下載單個文件
下面的命令將獲取URL的內容並將其顯示在STDOUT中(即在你的終端上)。
<code>curl URL/<code>
要將輸出存儲到文件中,您可以將其重定向,如下所示。這還將顯示一些額外的下載統計信息。
<code>curl URL > output.html/<code>
將cURL輸出保存到文件
我們可以使用-o/-O選項將curl命令的結果保存到文件中。
- -o(小寫o)結果將保存在命令行中提供的文件名中。
- -O(大寫O)將採用URL中的文件名,並將其用作存儲結果的文件名
<code>curl -o gettext.html URL/<code>
現在,頁面URL將保存在名為“gettext.html”的文件中。你還會注意到,當使用-o選項運行curl時,它會顯示下載的進度表。
當你使用curl-O(大寫O)時,它會使用URL後綴文件名,並將內容保存在本地。
注意:當cURL必須將數據寫入終端時,它會禁用進度表,以避免打印時的混亂。我們可以使用‘>’|‘-o’|‘-O’選項將結果移動到文件中。
一次下載多個頁面
通過在命令行上指定URL,我們可以一次下載多個文件。
<code>curl -O URL1 -O URL2/<code>
下面的命令將下載a.html和b.html,並將其以對應的名稱保存在當前目錄下。
<code>curl -O URL/a.html -O URL/b.html/<code>
當我們如上所述從同一服務器下載多個文件時,cURL將會嘗試複用該連接。
使用-L選項跟隨請求頭HTTP Location
默認情況下,cURL不跟隨HTTP Location標頭。它也稱為重定向。
當請求的網頁移動到另一個位置時,HTTP Location標頭將作為響應發送,它將顯示實際網頁所在的位置。
例如,當用戶在瀏覽器中鍵入a.com時,它將自動重定向到b.com。這是基於HTTP Location標頭完成的,如下所示。
<code>curl a.com
<title>302 Moved/<title>302 Moved
The document has moved
/<code>
上述信息也表明請求地址被永久重定向(302)到了其他地址。
我們可以使用-L選項堅持curl遵循重定向,使它下載最終的目標頁面。
<code>curl -L a.com/<code>
斷點續傳
使用curl-C選項,您可以繼續下載由於某種原因已經停止的下載。當下載大文件,但網絡被中斷時,這將很有幫助。
如果我們使用“-C -”選項,那麼cURL將找到斷點並開始恢復下載。
我們還可以給出一個偏移量‘-C’。將從源文件的開頭跳過給定的偏移量字節 。
下面測試一下。使用curl開始大文件的下載,然後在下載之間按Ctrl-C組合鍵停止下載。
<code>curl -O URL
############## 42.1%/<code>
下面額#表示進度條,下載停止在42.1%。
使用“curl -C -”,我們可以從前面停止的地方繼續下載。現在,下載進度將從42.1%繼續。
<code>curl -C - -O URL
############### 42.1%/<code>
限制下載速度
你可以使用-limit-rate選項限制數據的傳輸量,將最大傳輸速率指定為參數。
<code> curl --limit-rate 50k -O UTL/<code>
上述命令將數據傳輸限制為50kb/秒。在短時間內,curl可以使用較高的傳輸速率。但平均而言,它將達到50kb/秒左右。可以使用大文件進行速度測試。
僅當文件在給定時間之前/之後被修改時才下載
我們可以使用curl中的-z選項獲取在特定時間之後修改的文件。這對FTP和HTTP都有效。
<code>curl -z 2012-03-04 URL/<code>
上述命令僅當URL文件晚於給定日期和時間時,上述命令才會下載。
<code>curl -z -2012-03-04 URL/<code>
上述命令正好反過來,僅當URL文件早於給定日期時間才進行下載。
有關日期表達式支持的各種語法,請參考 man curl_getdate。
在cURL中傳遞HTTP身份驗證
有時,網站需要用戶名和密碼才能查看內容(可以使用.htaccess文件)。在-u選項的幫助下,我們可以將這些憑據從cURL傳遞到Web服務器,如下所示。
<code>curl -u username:password URL/<code>
默認情況下,cURL使用基本HTTP身份驗證,我們可以使用-ntlm | -digest指定其他身份驗證方法。
從FTP服務器下載資源
cURL還可以用於從FTP服務器下載文件。如果給定的FTP路徑是目錄,則默認情況下將列出特定目錄下的文件。
<code>curl -u user:password -O ftp://ftp_server/path/to/file/readme/<code>
上述命令將會直接下載FTP服務器上的readme文件。
<code>curl -u user:password -O ftp://ftp_server/path/to/file//<code>
上述命令則羅列出該目錄下所有的目錄和文件。
模糊匹配下載路徑
cURL支持URL中給定的範圍。當給定範圍時,將下載該範圍內匹配的文件。從FTP鏡像站點下載軟件包會很有幫助。
<code> curl ftp://ftp_server/path/to/dest/[a-z]//<code>
這樣會羅列出所有從dest/a/ 到 dest/z/ 目錄下的所有文件和目錄。
上傳文件到FTP服務器
cURL還可以用於通過-T選項將文件上傳到FTP服務器。
<code>curl -u user:password -T build.tar.gz ftp://ftp_server/path/to/dest//<code>
上述命令把壓縮包 build.tar.gz 推送到FTP服務器目錄。
<code>curl -u user:password -T "{file1,file2}" ftp://ftp_server//<code>
上述命令則是上傳多個文件到FTP服務器。
還有一個黑魔法,就是“-”,使用管道處理,獲取stdin信息流,並經由cURL上傳到FTP服務器。
<code>echo blablabla | curl -u user:password -T - ftp://ftp_server/path/summary.log/<code>
更詳細的輸出
Linux下的同學應該很熟悉,多加幾個-v就可以了。cURL也是如此。
<code>curl -vvv URL/<code>
加到3個-v,請求的握手過程都給打印出來了。
通過代理下載文件
我們可以使用-x選項指定curl來使用代理執行特定的操作,需要指定代理的主機和端口。
<code>curl -x proxy_ip:port URL/<code>
使用長選項更好記。
<code>curl --proxy proxy_ip:port URL/<code>
使用SMTP協議發郵件
cURL還可用於通過SMTP協議發送郵件。你應該指定發件人地址、收件人地址和郵件服務器IP地址,如下所示。
<code>curl --mail-from [email protected] --mail-rcpt [email protected] smtp://mailserver.com/<code>
一旦輸入上述命令,它將等待用戶向郵件提供數據。編寫完消息後,請鍵入.(英文句號)作為最後一行,將立即發送電子郵件。
<code>Subject: Testing
This is a test mail
./<code>
寫在最後
cURL提供的能力,不亞於生態完整的瀏覽器,更多用法等你來使用。
閱讀更多 程序員小助手 的文章