在本教程中,我們將介紹Linux中的cURL命令。我們會給出一些示例來指導(dǎo)您了解這個強大的實用程序的功能,幫助您理解它所能實現(xiàn)的所有功能。cURL命令用于使用其20多種受支持協(xié)議之一,將數(shù)據(jù)下載或上傳到服務(wù)器。此數(shù)據(jù)可以是文件、電子郵件或網(wǎng)頁。
什么是cURL命令?
下載文件
遵循重定向
停止并繼續(xù)下載
指定超時
使用用戶名和密碼
使用代理
分塊下載大文件
客戶端證書
Silent cURL
獲取標(biāo)題
多個headers
發(fā)布(上傳)文件
發(fā)送電子郵件
閱讀電子郵件
cURL和wget之間的區(qū)別
cURL是與網(wǎng)站或API進行交互,向終端發(fā)送請求并顯示響應(yīng)或?qū)?shù)據(jù)記錄到文件的理想工具。有時,它用作較大腳本的一部分,將檢索到的數(shù)據(jù)交給其他函數(shù)進行處理。
由于cURL可用于從服務(wù)器檢索文件,所以通常用于下載網(wǎng)站的一部分。它可以很好地執(zhí)行此功能,但有時wget命令更適合這項工作。在本文后面的內(nèi)容中,我們將介紹wget和cURL之間的一些異同。我們將在下面的部分中向您展示如何開始使用cURL。我們可以給cURL的最基本命令是下載網(wǎng)站或文件。除非我們指定一個不同的協(xié)議,否則cURL將使用HTTP作為其默認(rèn)協(xié)議。要下載網(wǎng)站,只需發(fā)出以下命令:
$ curl http://www.google.com
當(dāng)然,請輸入要檢索的任何網(wǎng)站或頁面。
像這樣執(zhí)行基本命令而沒有其他選項很少有用,因為這只會告訴cURL檢索您所提供頁面的源代碼。
當(dāng)我們運行命令時,我們的終端充滿了HTML和其他Web腳本代碼——在這種形式下,對我們來說不是特別有用。讓我們將網(wǎng)站下載為HTML文檔,這樣就可以顯示內(nèi)容,可以添加-output選項來實現(xiàn)cURL。$ curl www.likegeeks.com --output likegeeks.html
現(xiàn)在,我們下載的網(wǎng)站可以打開并顯示在瀏覽器中。
如果您要下載在線文件,則命令大致相同。但是請確保將-output選項附加到cURL中,就像我們在上面的示例中所做的那樣。如果您沒有這樣做,則cURL會將在線文件的二進制輸出發(fā)送到您的終端,這可能會導(dǎo)致其發(fā)生故障。這是我們開始下載500KB Word文檔時的樣子。
Word文檔開始下載,并且終端中顯示下載的當(dāng)前進度。下載完成后,該文件將在我們保存該文件的目錄中可用。在此示例中,未指定目錄,因此將其保存到當(dāng)前的工作目錄(運行cURL命令的目錄)。另外,您是否注意到我們在cURL命令中指定的-L選項了么?為了下載此文件,這是必要的,我們將在下一部分中介紹它的功能。如果在嘗試對網(wǎng)站進行URL生成時輸出為空,則可能意味著該網(wǎng)站告訴cURL重定向到其他URL。默認(rèn)情況下,cURL不會遵循重定向,但是您可以使用 -L switch來告訴它。
$ curl -L www.likegeeks.com
在本文的研究中,我們發(fā)現(xiàn)有必要在大多數(shù)網(wǎng)站上指定-L,因此請務(wù)必記住這一小技巧。默認(rèn)情況下,您甚至可能希望將其附加到大多數(shù)cURL命令中。如果您的下載中斷了,或者您需要下載一個大文件但又不想一次完成所有操作,所以cURL提供了一種選項,可以從中斷處繼續(xù)傳輸。
要手動停止傳輸,您可以使用ctrl + c組合鍵結(jié)束cURL進程,就像停止當(dāng)前正在運行的幾乎所有進程一樣。
我們的下載已經(jīng)開始,但是被ctrl + c中斷了,現(xiàn)在讓我們使用以下語法恢復(fù)下載:$ curl -C - example.com/some-file.zip --output MyFile.zip
-C switch是恢復(fù)我們文件傳輸?shù)脑O(shè)備,但還要注意,它后面緊跟一個破折號(-)。這告訴cURL繼續(xù)文件傳輸,但是實現(xiàn)這一步,首先要查看已經(jīng)下載的部分,找到下載的最后一個字節(jié)才可以確定從何處可以恢復(fù)。
這時候我們的文件傳輸已恢復(fù),可以繼續(xù)完成下載。如果您希望cURL在您不做操作之后的一段時間還可以繼續(xù)之前的工作,那么可以在命令中指定超時,這特別有用,因為cURL中的某些操作默認(rèn)情況下沒有超時,所以如果您不希望其無限期掛起,則需要指定一個。
您可以使用-m switch指定執(zhí)行命令所需的最長時間。經(jīng)過指定的時間后,cURL將退出正在執(zhí)行的操作,即使它正在下載或上傳文件。cURL會以秒為單位指定您想要的最長時間。因此,要在一分鐘后超時,該命令將如下所示:您可以使用cURL指定的另一種超時類型是用于鏈接的時間量。這有助于確保cURL不會花費過多的時間來嘗試連接處于脫機狀態(tài)或無法訪問的主機。
它也接受秒作為參數(shù)。該選項被寫為–connect-timeout。 $ curl --connect-timeout 60 example.com
您可以使用-u switch在cURL命令中指定用戶名和密碼。例如,如果您想通過FTP服務(wù)器進行身份驗證,則語法如下所示: $ curl -u username:password ftp://example.com
您可以將其用于任何協(xié)議,但是FTP通常用于諸如此類的簡單文件傳輸。
如果要下載上面的屏幕快照中顯示的文件,我們只需使用文件的完整路徑發(fā)出相同的命令。$ curl -u username:password ftp://example.com/readme.txt
在連接主機之前,很容易直接使用cURL來使用代理。cURL將默認(rèn)使用HTTP代理,除非您另外指定。使用-x switch定義代理。由于在此示例中未指定協(xié)議,因此cURL將假定它是HTTP代理。$ curl -x 192.168.1.1:8080 http://example.com
此命令將使用端口8080上的192.168.1.1作為代理連接到example.com。
您也可以將其與其他協(xié)議一起使用。下面是一個使用HTTP代理將UR cURLL到FTP服務(wù)器并檢索文件的示例。$ curl -x 192.168.1.1:8080 ftp://example.com/readme.txt
cURL支持許多其他類型的代理和與這些代理一起使用的選項,但進一步擴展將超出本指南的范圍。請查閱cURL手冊頁,以獲取有關(guān)代理 tunneling,SOCKS代理,身份驗證等的更多信息。我們已經(jīng)展示了如何停止和恢復(fù)文件傳輸,但是如果我們希望cURL僅下載文件的一部分怎么辦?這樣,我們可以下載多個塊文件。
如果您需要保持下載上限或類似限制,則可以僅下載文件的某些部分。–range標(biāo)志用于完成此操作。
大小必須以字節(jié)為單位。因此,如果我們想以100 MB的塊大小下載最新的Ubuntu .iso文件,則第一個命令將如下所示:$ curl --range 0-99999999 http://releases.ubuntu.com/18.04/ubuntu-18.04.3-desktop-amd64.iso ubuntu-part1
第二個命令將需要在下一個字節(jié)提取并下載另一個100 MB的塊。$ curl --range 0-99999999 http://releases.ubuntu.com/18.04/ubuntu-18.04.3-desktop-amd64.iso ubuntu-part1
$ curl --range 100000000-199999999 http://releases.ubuntu.com/18.04/ubuntu-18.04.3-desktop-amd64.iso ubuntu-part2
重復(fù)此過程,直到下載了所有塊。最后一步是將這些塊組合到一個文件中,這可以使用cat命令來完成。$ cat ubuntu-part? > ubuntu-18.04.3-desktop-amd64.iso
要使用證書身份驗證而不是基本身份驗證訪問服務(wù)器,可以使用–cert選項指定證書文件。
$ curl --cert path/to/cert.crt:password ftp://example.com
還有更多與證書相關(guān)的選項:–cacert、–cert-status、–cert-type等。請查看手冊頁以獲取選項的完整列表。如果您不想顯示cURL的進度表和錯誤消息,則-s switch可提供該功能。它仍然會輸出您請求的數(shù)據(jù),因此,如果您希望命令100%保持靜音,則需要將輸出定向到一個文件中。將此命令與-O flag結(jié)合使用可將文件保存在當(dāng)前的工作目錄中。這將確保cURL返回0輸出。$ curl -s -O http://example.com
或者,您可以使用–output選項選擇保存文件的位置并指定名稱。
$ curl -s http://example.com --output index.html
使用cURL來獲取遠(yuǎn)程地址的標(biāo)題非常簡單,您只需要使用-I選項即可。
如果將此選項與–L選項結(jié)合使用,則cURL將返回其重定向到的每個地址的headers。您可以使用-H選項將header傳遞給cURL。要傳遞多個header,您只需多次使用-H選項。這是一個例子:$ curl -H 'Connection: keep-alive' -H 'Accept-Charset: utf-8 ' http://example.com
POST是網(wǎng)站接受數(shù)據(jù)的常用方式。例如,當(dāng)您在線填寫表格時,很有可能是使用POST方法從瀏覽器發(fā)送數(shù)據(jù)。要將數(shù)據(jù)以這種方式發(fā)送到網(wǎng)站,請使用-d選項。$ curl -d 'name=geek&location=usa' http://example.com
要上傳文件而不是文本,語法應(yīng)如下所示:
$ curl -d @filename http://example.com
根據(jù)需要使用多個-d標(biāo)志,以指定要嘗試上載的所有不同數(shù)據(jù)或文件名。如果要將文件上傳到FTP服務(wù)器,則可以使用-T選項。$ curl -T myfile.txt ftp://example.com/some/directory/
發(fā)送電子郵件只是將數(shù)據(jù)從您的計算機(或其他設(shè)備)上傳到電子郵件服務(wù)器。由于cURL能夠上傳數(shù)據(jù),因此我們可以使用它來發(fā)送電子郵件。有很多選項,但是這里有一個有關(guān)如何通過SMTP服務(wù)器發(fā)送電子郵件的示例:$ curl smtp://mail.example.com --mail-from me@example.com --mail-rcpt john@domain.com –upload-file email.txt
$ cat email.txt
From: Web Administrator <me@example.com>
To: John Doe <john@domain.com>
Subject: An example email
Date: Sat, 7 Dec 2019 02:10:15
John,
Hope you have a great weekend.
-Admin
像往常一樣,可以在cURL的手冊頁中找到更詳細(xì)、更專業(yè)的選項。cURL支持IMAP(和IMAPS)和POP3,兩者均可用于從郵件服務(wù)器檢索電子郵件。$ curl -u username:password imap://mail.example.com
此命令將列出可用的郵箱,但不查看任何特定的郵件。為此,請使用–X選項指定消息的UID。$ curl -u username:password imap://mail.example.com -X 'UID FETCH 1234'
有時人們會混淆cURL和wget,因為它們都能夠從服務(wù)器檢索數(shù)據(jù)。但這是他們唯一的共同點。
我們在本文中展示了cURL的功能。wget提供了一組不同的函數(shù)。wget是下載網(wǎng)站的最佳工具,并且能夠遞歸遍歷目錄和鏈接以下載整個網(wǎng)站。要下載網(wǎng)站,請使用wget。如果使用HTTP或HTTPS以外的其他協(xié)議或用于上傳文件,請使用cURL。cURL也是從Web下載單個文件的不錯選擇,不過wget也做得很好。