curl,全稱CommandLine URL 或 CommandLine Uniform Resource Locator,顧名思義,curl命令是在命令行方式下工作,利用URL的語法進行數據的傳輸或者文件的傳輸。
crul的官方網站是 HTTPS://curl.haxx.se/ , 我們可以通過該網站獲取此工具的最新版本,還有最全面的使用方法。
從官網可以知道,curl支持30多種類型的傳輸方式,例如:FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMB, SMBS, SMTP, SMTPS, Te.NET and TFTP等,這當中包含多種協議。最常使用的有FILE、FTP、HTTP、HTTPS等協議。
對于運維人員來說,在我們探測遠程服務的時候,比如http傳輸,SOCKET連接時,這個工具能非常方便的作為驗證工具和測試工具。
下面看幾個curl典型應用實例。
1、 僅僅顯示header信息
這個用法運維人員經常使用,可以探測一個網站的header信息,例如:
[root@localhost ~]# curl -I https://www.ixdba.net HTTP/1.1 200 OK Server: Nginx/1.13.9 Date: Mon, 04 Mar 2019 08:11:31 GMT Content-Type: text/html; charset=UTF-8 Connection: keep-alive
通過curl的“-I”(大寫的i)參數可以獲取指定網站的header頭信息,可以發現上面這個網站可以正常訪問(200狀態碼),同時此網站的web服務器是nginx/1.13.9,并且還開啟了keep-alive。這些信息都是web運維必須要具備的。
2、顯示http狀態代碼
http狀態碼對web運維來講,非常重要,在對web頁面進行監控的時候,會經常通過狀態碼來判斷網頁的狀態,如果返回狀態碼為非200狀態,那么則認為網頁異常。要獲取網頁狀態碼,除了上面的“-I”參數外,還有更專業的方法,那就是使用 “-s”和“-o”參數組合,最后使用“-w”參數,可以這樣使用:
[root@localhost ~]#curl -s -o /dev/null -w %{http_code}"n" http://www.baidu.com 200
其中:
? “-s”: 表示安靜模式,不輸出錯誤,或者進度條之類的。 ? “-o”: 表示指定輸出結果到某個文件,不指定的話默認是終端。這里是將結果寫入空設備中。 ? “-w”表示輸出一些定義的元數據,這里輸出的是%{http_code},即http狀態碼。除去http_code,還有http_connect、time_total、time_connect、time_Appconnect、time_redirect、size_download 、size_upload 、content_type、ssl_verify_result等變量可供選擇。輸出變量需要按照%{variable_name}的格式。 ? “n”表示換行
再來看個例子,通過http協議訪問一個網站,命令如下:
[root@localhost ~]#curl -s -o /dev/null -w %{http_code}" "%{time_total}" "%{redirect_url}"n" http://www.ixdba.net 301 0.141 https://www.ixdba.net/
可以看到輸出結果有個301,這表示當通過http訪問此網站的時候,自動跳轉到了https,執行了301定向操作,所以狀態碼變成了301,第二個輸出“0.141”是變量“%{time_total}”解析出的結果,代表總時間,按秒計。精確到小數點后三位,最后的“https://www.ixdba.net/” 是"%{redirect_url}"變量的輸出結果,代表跳轉后的url。
3、使用curl實現url地址重定向(自動跳轉)
默認情況下CURL不會發送HTTP Location headers(重定向),但使用了“-L”選項后,當一個被請求頁面移動到另一個站點時,就會發送一個HTTP Loaction header作為請求,然后將請求重定向到新的地址上。例如:訪問http://www.ixdba.net 時,會自動將地址重定向到 https://www.ixdba.net 上。
[root@localhost ~]# curl -L -I http://www.ixdba.net HTTP/1.1 301 Moved Permanently Server: nginx/1.13.9 Date: Fri, 01 Mar 2019 07:25:57 GMT Content-Type: text/html Content-Length: 185 Connection: keep-alive Location: https://www.ixdba.net/ Strict-Transport-Security: max-age=31536000; includeSubDomains; preload HTTP/1.1 200 OK Server: nginx/1.13.9 Date: Fri, 01 Mar 2019 07:25:58 GMT Content-Type: text/html; charset=UTF-8 Connection: keep-alive
輸出有兩個部分,可以看到有自動的跳轉,這是因為使用了-L參數,curl就會跳轉到新的網址。
4、抓取網頁內容,并保存到本地
curl也能下載文件,達到跟wget相同的功能,例如將一個url文件保存到本地,保存原始文件名,可以通過“-O”參數實現:
[root@localhost ~]# curl -O https://www.ixdba.net/archives/2017/06/653.htm
但是有時候url中的文件名不固定或者想下載后重命名,可以通過“-o”實現,例如將url中的文件下載到本地,并命名為test.html,命令如下:
[root@localhost ~]#curl -o test.html https://www.ixdba.net/archives/2017/06/653.htm
這里面涉及兩個curl參數,分別是:
? -o/--output 將文件保存為命令行中指定的文件名的文件中 ? -O/--remote-name 使用URL中默認的文件名保存文件到本地
5、通過curl下載文件并開啟斷點續傳
curl也可以實現下載大文件,并實現斷點續傳,先看下面這個例子,如下圖所示:
可以看到,curl下載文件其實比wget更好用,可以看到下載文件時的各個屬性,文件總大小,已下載大小,下載耗時多少,下載速度多少等等。
在下載一會后,執行ctrl+c,中斷下載,接著再次執行curl下載,看看是否能夠實現斷點續傳功能,如下圖所示:
這里使用了三個參數:
-C/--continue-at : 斷點續轉,注意斷點續傳的參數是-C, 要自動續傳的話要使用 "-C -", 否則需要手工指定斷點的字節位置。這個特別注意。
6、對CURL的最大網絡使用帶寬進行限速
與wget類似,curl在下載文件時也會占滿系統帶寬,這樣一來,可能會影響線上業務系統的正常運行,因此,限速也是要做的,可以通過“--limit-rate”選項,實現對curl下載網速限制,來看一個例子:
這是限制下載速度為2M,看最下面的下載速度剛好是2048k左右,實現了帶寬限速。
7、通過CURL訪問需要授權的頁面
在訪問需要授權的頁面時,可通過-u選項提供用戶名和密碼進行授權
[root@localhost ~]# curl -u username:password URL
上面的做法很明顯,存在密碼泄露的風險,通常的做法是在命令行只輸入用戶名,之后會提示輸入密碼,這樣可以保證在查看歷史記錄時不會將密碼泄露。
[root@localhost ~]# curl -u username URL
8、通過curl從FTP服務器下載、上傳文件
CURL不但支持http,同樣也支持FTP下載,若在url中指定的是某個文件路徑而非具體的某個要下載的文件名,CURL則會列出該目錄下的所有文件名而并非下載該目錄下的所有文件
例如:列出public_html下的所有文件夾和文件
curl -u ftpuser:ftppass ftp://ftp_server/public_html/
看下面這個例子,如下圖所示:
要下載一個文件,可以執行如下命令:
curl -u ftpuser:ftppass -O ftp://ftp_server/public_html/getssl.php
例如下圖操作:
除了下載操作,curl也可以將文件上傳到FTP服務器上,通過“-T”選項可將指定的本地文件上傳到FTP服務器上。例如:
將myfile.txt文件上傳到服務器:
curl -u ftpuser:ftppass -T myfile.txt ftp://ftp.testserver.com
看下圖操作:
curl也可以同時上傳多個文件,方法如下:
curl -u ftpuser:ftppass -T "{file1,file2}" ftp://ftp.testserver.com
curl還可以從標準輸入獲取內容保存到服務器指定的文件中,方法如下:
curl -u ftpuser:ftppass -T - ftp://ftp.testserver.com/myfile_1.txt
9、CURL使用SSL證書訪問HTTPS
有時候在通過curl下載基于https的鏈接文件時,會提示ssl認證失敗,或者ssl不可信,此時可以使用 -k 或者“-insecure”選項,來忽略簽名認證的警告。 這樣就可以讓curl命令執行不安全的SSL連接,進而去獲取數據。
命令使用示例如下:
curl -k https://abc.com curl --insecure https://www.tttao.com