常在web漂,哪有不挨刀:curl獨門絕技,不來學幾招防身嗎?

引言

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中(即在你的終端上)。

curl URL

要將輸出存儲到文件中,您可以將其重定向,如下所示。這還將顯示一些額外的下載統計信息。

curl URL > output.html

將cURL輸出保存到文件

我們可以使用-o/-O選項將curl命令的結果保存到文件中。

  • -o(小寫o)結果將保存在命令行中提供的文件名中。
  • -O(大寫O)將採用URL中的文件名,並將其用作存儲結果的文件名
curl -o gettext.html URL

現在,頁面URL將保存在名為「gettext.html」的文件中。你還會注意到,當使用-o選項運行curl時,它會顯示下載的進度表。

當你使用curl-O(大寫O)時,它會使用URL後綴文件名,並將內容保存在本地。

注意:當cURL必須將數據寫入終端時,它會禁用進度表,以避免打印時的混亂。我們可以使用『>』|『-o』|『-O』選項將結果移動到文件中

一次下載多個頁面

通過在命令行上指定URL,我們可以一次下載多個文件。

curl -O URL1 -O URL2

下面的命令將下載a.html和b.html,並將其以對應的名稱保存在當前目錄下。

curl -O URL/a.html -O URL/b.html

當我們如上所述從同一服務器下載多個文件時,cURL將會嘗試復用該連接。

使用-L選項跟隨請求頭HTTP Location

默認情況下,cURL不跟隨HTTP Location標頭。它也稱為重定向

當請求的網頁移動到另一個位置時,HTTP Location標頭將作為響應發送,它將顯示實際網頁所在的位置。

例如,當用戶在瀏覽器中鍵入a.com時,它將自動重定向到b.com。這是基於HTTP Location標頭完成的,如下所示。

curl a.com    <TITLE>302 Moved</TITLE>  <H1>302 Moved</H1>  The document has moved  <A HREF="http://b.com">here</A>

上述信息也表明請求地址被永久重定向(302)到了其他地址。

我們可以使用-L選項堅持curl遵循重定向,使它下載最終的目標頁面。

curl -L a.com

斷點續傳

使用curl-C選項,您可以繼續下載由於某種原因已經停止的下載。當下載大文件,但網絡被中斷時,這將很有幫助。

如果我們使用「-C -」選項,那麼cURL將找到斷點並開始恢復下載

我們還可以給出一個偏移量『-C<偏移量>』。將從源文件的開頭跳過給定的偏移量位元組

下面測試一下。使用curl開始大文件的下載,然後在下載之間按Ctrl-C組合鍵停止下載。

curl -O URL  ##############             42.1%

下面額#表示進度條,下載停止在42.1%。

使用「curl -C -」,我們可以從前面停止的地方繼續下載。現在,下載進度將從42.1%繼續。

curl -C - -O URL  ###############            42.1%

限制下載速度

你可以使用-limit-rate選項限制數據的傳輸量,將最大傳輸速率指定為參數。

 curl --limit-rate 50k -O UTL

上述命令將數據傳輸限制為50kb/秒。在短時間內,curl可以使用較高的傳輸速率。但平均而言,它將達到50kb/秒左右。可以使用大文件進行速度測試。

僅當文件在給定時間之前/之後被修改時才下載

我們可以使用curl中的-z選項獲取在特定時間之後修改的文件。這對FTP和HTTP都有效。

curl -z 2012-03-04 URL

上述命令僅當URL文件晚於給定日期和時間時,上述命令才會下載。

curl -z -2012-03-04 URL

上述命令正好反過來,僅當URL文件早於給定日期時間才進行下載。

有關日期表達式支持的各種語法,請參閱 man curl_getdate。

在cURL中傳遞HTTP身份驗證

有時,網站需要用戶名和密碼才能查看內容(可以使用.htaccess文件)。在-u選項的幫助下,我們可以將這些憑據從cURL傳遞到Web服務器,如下所示。

curl -u username:password URL

默認情況下,cURL使用基本HTTP身份驗證,我們可以使用-ntlm | -digest指定其他身份驗證方法。

從FTP服務器下載資源

cURL還可以用於從FTP服務器下載文件。如果給定的FTP路徑是目錄,則默認情況下將列出特定目錄下的文件。

curl -u user:password -O ftp://ftp_server/path/to/file/readme

上述命令將會直接下載FTP服務器上的readme文件。

curl -u user:password -O ftp://ftp_server/path/to/file/

上述命令則羅列出該目錄下所有的目錄和文件。

模糊匹配下載路徑

cURL支持URL中給定的範圍。當給定範圍時,將下載該範圍內匹配的文件。從FTP鏡像站點下載軟件包會很有幫助。

 curl ftp://ftp_server/path/to/dest/[a-z]/

這樣會羅列出所有從dest/a/ 到 dest/z/ 目錄下的所有文件和目錄。

上傳文件到FTP服務器

cURL還可以用於通過-T選項將文件上傳到FTP服務器。

curl -u user:password -T build.tar.gz ftp://ftp_server/path/to/dest/

上述命令把壓縮包 build.tar.gz 推送到FTP服務器目錄。

curl -u user:password -T "{file1,file2}" ftp://ftp_server/

上述命令則是上傳多個文件到FTP服務器。

還有一個黑魔法,就是「-」,使用管道處理,獲取stdin信息流,並經由cURL上傳到FTP服務器。

echo blablabla | curl -u user:password -T - ftp://ftp_server/path/summary.log

更詳細的輸出

Linux下的同學應該很熟悉,多加幾個-v就可以了。cURL也是如此。

curl -vvv URL

加到3個-v,請求的握手過程都給打印出來了。

通過代理下載文件

我們可以使用-x選項指定curl來使用代理執行特定的操作,需要指定代理的主機和端口。

curl -x proxy_ip:port URL

使用長選項更好記。

curl --proxy proxy_ip:port URL

使用SMTP協議發郵件

cURL還可用於通過SMTP協議發送郵件。你應該指定發件人地址、收件人地址和郵件服務器IP地址,如下所示。

curl --mail-from [email protected] --mail-rcpt [email protected] smtp://mailserver.com

一旦輸入上述命令,它將等待用戶向郵件提供數據。編寫完消息後,請鍵入.(英文句號)作為最後一行,將立即發送電子郵件。

Subject: Testing  This is a test mail  .

寫在最後

cURL提供的能力,不亞於生態完整的瀏覽器,更多用法等你來使用。