來自公眾號(hào):CU技術(shù)社區(qū)
在本教程中,我們將介紹Linux中的cURL命令。我們會(huì)給出一些示例來指導(dǎo)您了解這個(gè)強(qiáng)大的實(shí)用程序的功能,幫助您理解它所能實(shí)現(xiàn)的所有功能。cURL命令用于使用其20多種受支持協(xié)議之一,將數(shù)據(jù)下載或上傳到服務(wù)器。此數(shù)據(jù)可以是文件、電子郵件或網(wǎng)頁。
什么是cURL命令?
下載文件
遵循重定向
停止并繼續(xù)下載
指定超時(shí)
使用用戶名和密碼
使用代理
分塊下載大文件
客戶端證書
Silent cURL
獲取標(biāo)題
多個(gè)headers
發(fā)布(上傳)文件
發(fā)送電子郵件
閱讀電子郵件
cURL和wget之間的區(qū)別
cURL是與網(wǎng)站或API進(jìn)行交互,向終端發(fā)送請(qǐng)求并顯示響應(yīng)或?qū)?shù)據(jù)記錄到文件的理想工具。有時(shí),它用作較大腳本的一部分,將檢索到的數(shù)據(jù)交給其他函數(shù)進(jìn)行處理。
由于cURL可用于從服務(wù)器檢索文件,所以通常用于下載網(wǎng)站的一部分。它可以很好地執(zhí)行此功能,但有時(shí)wget命令更適合這項(xiàng)工作。在本文后面的內(nèi)容中,我們將介紹wget和cURL之間的一些異同。我們將在下面的部分中向您展示如何開始使用cURL。我們可以給cURL的最基本命令是下載網(wǎng)站或文件。除非我們指定一個(gè)不同的協(xié)議,否則cURL將使用HTTP作為其默認(rèn)協(xié)議。要下載網(wǎng)站,只需發(fā)出以下命令:
$ curl http://www.google.com
當(dāng)然,請(qǐng)輸入要檢索的任何網(wǎng)站或頁面。

像這樣執(zhí)行基本命令而沒有其他選項(xiàng)很少有用,因?yàn)檫@只會(huì)告訴cURL檢索您所提供頁面的源代碼。

當(dāng)我們運(yùn)行命令時(shí),我們的終端充滿了HTML和其他Web腳本代碼——在這種形式下,對(duì)我們來說不是特別有用。讓我們將網(wǎng)站下載為HTML文檔,這樣就可以顯示內(nèi)容,可以添加-output選項(xiàng)來實(shí)現(xiàn)cURL。$ curl www.likegeeks.com --output likegeeks.html

現(xiàn)在,我們下載的網(wǎng)站可以打開并顯示在瀏覽器中。

如果您要下載在線文件,則命令大致相同。但是請(qǐng)確保將-output選項(xiàng)附加到cURL中,就像我們?cè)谏厦娴氖纠兴龅哪菢印?/span>如果您沒有這樣做,則cURL會(huì)將在線文件的二進(jìn)制輸出發(fā)送到您的終端,這可能會(huì)導(dǎo)致其發(fā)生故障。這是我們開始下載500KB Word文檔時(shí)的樣子。

Word文檔開始下載,并且終端中顯示下載的當(dāng)前進(jìn)度。下載完成后,該文件將在我們保存該文件的目錄中可用。在此示例中,未指定目錄,因此將其保存到當(dāng)前的工作目錄(運(yùn)行cURL命令的目錄)。另外,您是否注意到我們?cè)赾URL命令中指定的-L選項(xiàng)了么?為了下載此文件,這是必要的,我們將在下一部分中介紹它的功能。如果在嘗試對(duì)網(wǎng)站進(jìn)行URL生成時(shí)輸出為空,則可能意味著該網(wǎng)站告訴cURL重定向到其他URL。默認(rèn)情況下,cURL不會(huì)遵循重定向,但是您可以使用 -L switch來告訴它。
$ curl -L www.likegeeks.com

在本文的研究中,我們發(fā)現(xiàn)有必要在大多數(shù)網(wǎng)站上指定-L,因此請(qǐng)務(wù)必記住這一小技巧。默認(rèn)情況下,您甚至可能希望將其附加到大多數(shù)cURL命令中。如果您的下載中斷了,或者您需要下載一個(gè)大文件但又不想一次完成所有操作,所以cURL提供了一種選項(xiàng),可以從中斷處繼續(xù)傳輸。
要手動(dòng)停止傳輸,您可以使用ctrl + c組合鍵結(jié)束cURL進(jìn)程,就像停止當(dāng)前正在運(yùn)行的幾乎所有進(jìn)程一樣。

我們的下載已經(jīng)開始,但是被ctrl + c中斷了,現(xiàn)在讓我們使用以下語法恢復(fù)下載:$ curl -C - example.com/some-file.zip --output MyFile.zip
-C switch是恢復(fù)我們文件傳輸?shù)脑O(shè)備,但還要注意,它后面緊跟一個(gè)破折號(hào)(-)。這告訴cURL繼續(xù)文件傳輸,但是實(shí)現(xiàn)這一步,首先要查看已經(jīng)下載的部分,找到下載的最后一個(gè)字節(jié)才可以確定從何處可以恢復(fù)。

這時(shí)候我們的文件傳輸已恢復(fù),可以繼續(xù)完成下載。如果您希望cURL在您不做操作之后的一段時(shí)間還可以繼續(xù)之前的工作,那么可以在命令中指定超時(shí),這特別有用,因?yàn)閏URL中的某些操作默認(rèn)情況下沒有超時(shí),所以如果您不希望其無限期掛起,則需要指定一個(gè)。
您可以使用-m switch指定執(zhí)行命令所需的最長(zhǎng)時(shí)間。經(jīng)過指定的時(shí)間后,cURL將退出正在執(zhí)行的操作,即使它正在下載或上傳文件。cURL會(huì)以秒為單位指定您想要的最長(zhǎng)時(shí)間。因此,要在一分鐘后超時(shí),該命令將如下所示:您可以使用cURL指定的另一種超時(shí)類型是用于鏈接的時(shí)間量。這有助于確保cURL不會(huì)花費(fèi)過多的時(shí)間來嘗試連接處于脫機(jī)狀態(tài)或無法訪問的主機(jī)。
它也接受秒作為參數(shù)。該選項(xiàng)被寫為–connect-timeout。 $ curl --connect-timeout 60 example.com
您可以使用-u switch在cURL命令中指定用戶名和密碼。例如,如果您想通過FTP服務(wù)器進(jìn)行身份驗(yàn)證,則語法如下所示: $ curl -u username:password ftp://example.com

您可以將其用于任何協(xié)議,但是FTP通常用于諸如此類的簡(jiǎn)單文件傳輸。
如果要下載上面的屏幕快照中顯示的文件,我們只需使用文件的完整路徑發(fā)出相同的命令。$ curl -u username:password ftp://example.com/readme.txt

在連接主機(jī)之前,很容易直接使用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é)議一起使用。下面是一個(gè)使用HTTP代理將UR cURLL到FTP服務(wù)器并檢索文件的示例。$ curl -x 192.168.1.1:8080 ftp://example.com/readme.txt
cURL支持許多其他類型的代理和與這些代理一起使用的選項(xiàng),但進(jìn)一步擴(kuò)展將超出本指南的范圍。請(qǐng)查閱cURL手冊(cè)頁,以獲取有關(guān)代理 tunneling,SOCKS代理,身份驗(yàn)證等的更多信息。我們已經(jīng)展示了如何停止和恢復(fù)文件傳輸,但是如果我們希望cURL僅下載文件的一部分怎么辦?這樣,我們可以下載多個(gè)塊文件。
如果您需要保持下載上限或類似限制,則可以僅下載文件的某些部分。–range標(biāo)志用于完成此操作。

大小必須以字節(jié)為單位。因此,如果我們想以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è)字節(jié)提取并下載另一個(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
重復(fù)此過程,直到下載了所有塊。最后一步是將這些塊組合到一個(gè)文件中,這可以使用cat命令來完成。$ cat ubuntu-part? > ubuntu-18.04.3-desktop-amd64.iso
要使用證書身份驗(yàn)證而不是基本身份驗(yàn)證訪問服務(wù)器,可以使用–cert選項(xiàng)指定證書文件。
$ curl --cert path/to/cert.crt:password ftp://example.com
cURL對(duì)于證書文件的格式有很多選項(xiàng)。

還有更多與證書相關(guān)的選項(xiàng):–cacert、–cert-status、–cert-type等。請(qǐng)查看手冊(cè)頁以獲取選項(xiàng)的完整列表。如果您不想顯示cURL的進(jìn)度表和錯(cuò)誤消息,則-s switch可提供該功能。它仍然會(huì)輸出您請(qǐng)求的數(shù)據(jù),因此,如果您希望命令100%保持靜音,則需要將輸出定向到一個(gè)文件中。將此命令與-O flag結(jié)合使用可將文件保存在當(dāng)前的工作目錄中。這將確保cURL返回0輸出。$ curl -s -O http://example.com
或者,您可以使用–output選項(xiàng)選擇保存文件的位置并指定名稱。
$ curl -s http://example.com --output index.html

使用cURL來獲取遠(yuǎn)程地址的標(biāo)題非常簡(jiǎn)單,您只需要使用-I選項(xiàng)即可。

如果將此選項(xiàng)與–L選項(xiàng)結(jié)合使用,則cURL將返回其重定向到的每個(gè)地址的headers。您可以使用-H選項(xiàng)將header傳遞給cURL。要傳遞多個(gè)header,您只需多次使用-H選項(xiàng)。這是一個(gè)例子:$ curl -H 'Connection: keep-alive' -H 'Accept-Charset: utf-8 ' http://example.com
POST是網(wǎng)站接受數(shù)據(jù)的常用方式。例如,當(dāng)您在線填寫表格時(shí),很有可能是使用POST方法從瀏覽器發(fā)送數(shù)據(jù)。要將數(shù)據(jù)以這種方式發(fā)送到網(wǎng)站,請(qǐng)使用-d選項(xiàng)。$ curl -d 'name=geek&location=usa' http://example.com
要上傳文件而不是文本,語法應(yīng)如下所示:
$ curl -d @filename http://example.com
根據(jù)需要使用多個(gè)-d標(biāo)志,以指定要嘗試上載的所有不同數(shù)據(jù)或文件名。如果要將文件上傳到FTP服務(wù)器,則可以使用-T選項(xiàng)。$ curl -T myfile.txt ftp://example.com/some/directory/
發(fā)送電子郵件只是將數(shù)據(jù)從您的計(jì)算機(jī)(或其他設(shè)備)上傳到電子郵件服務(wù)器。由于cURL能夠上傳數(shù)據(jù),因此我們可以使用它來發(fā)送電子郵件。有很多選項(xiàng),但是這里有一個(gè)有關(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的手冊(cè)頁中找到更詳細(xì)、更專業(yè)的選項(xiàng)。cURL支持IMAP(和IMAPS)和POP3,兩者均可用于從郵件服務(wù)器檢索電子郵件。$ curl -u username:password imap://mail.example.com
此命令將列出可用的郵箱,但不查看任何特定的郵件。為此,請(qǐng)使用–X選項(xiàng)指定消息的UID。$ curl -u username:password imap://mail.example.com -X 'UID FETCH 1234'
有時(shí)人們會(huì)混淆cURL和wget,因?yàn)樗鼈兌寄軌驈姆?wù)器檢索數(shù)據(jù)。但這是他們唯一的共同點(diǎn)。
我們?cè)诒疚闹姓故玖薱URL的功能。wget提供了一組不同的函數(shù)。wget是下載網(wǎng)站的最佳工具,并且能夠遞歸遍歷目錄和鏈接以下載整個(gè)網(wǎng)站。要下載網(wǎng)站,請(qǐng)使用wget。如果使用HTTP或HTTPS以外的其他協(xié)議或用于上傳文件,請(qǐng)使用cURL。cURL也是從Web下載單個(gè)文件的不錯(cuò)選擇,不過wget也做得很好。