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