天天看點

curl

我使用過的Linux指令之curl - 強大的網絡傳輸工具

本文連結:http://codingstandards.iteye.com/blog/807844   (轉載請注明出處)

curl指令是一個功能強大的網絡工具,它能夠通過http、ftp等方式下載下傳檔案,也能夠上傳檔案。其實curl遠不止前面所說的那些功能,大家可以通過man curl閱讀手冊頁擷取更多的資訊。類似的工具還有wget。

curl指令使用了libcurl庫來實作,libcurl庫常用在C程式中用來處理HTTP請求,curlpp是libcurl的一個C++封裝,這幾個東西可以用在抓取網頁、網絡監控等方面的開發,而curl指令可以幫助來解決開發過程中遇到的問題。

curl指令參數很多,這裡隻列出我曾經用過、特别是在shell腳本中用到過的那些。

-v/--verbose 小寫的v參數,用于列印更多資訊,包括發送的請求資訊,這在調試腳本是特别有用。

-m/--max-time <seconds> 指定處理的最大時長

-H/--header <header> 指定請求頭參數

-s/--slient 減少輸出的資訊,比如進度

--connect-timeout <seconds> 指定嘗試連接配接的最大時長

-x/--proxy <proxyhost[:port]> 指定代理伺服器位址和端口,端口預設為1080

-T/--upload-file <file> 指定上傳檔案路徑

-o/--output <file> 指定輸出檔案名稱

-d/--data/--data-ascii <data> 指定POST的内容

--retry <num> 指定重試次數

-e/--referer <URL> 指定引用位址

-I/--head 僅傳回頭部資訊,使用HEAD請求

[root@jfht ~]# curl http://www.sunrisecorp.net/

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta http-equiv="Content-Type" content="text/html; charset=gbk" />

<meta name="title" content="歡迎您 - 上海騰一" />

<meta name="keyword" content="上海騰一,融合通信,電子商務,語音通信,資料通信,基站工程外包托管,物聯網,網站建設,電子商務解決方案,移動網際網路,短信,彩 信,呼叫中心,多方會議,PBX,IVR,電子商務策劃方案,裝置代維,網絡優化,通信工程,電信增值,3G" />

<meta name="description" content="上海騰一資訊技術有限公司專注于電信增值、通信工程、電子商務等領域,擁有近十年的經驗。" />

<title>

歡迎您 - 上海騰一

</title>

插播一下廣告:上海騰一資訊技術有限公司是一家緻力于通信工程、電子商務和電信增值業務的公司,請通路官方網址: http://www.sunrisecorp.net/ 。

此處省略掉網頁内容 。

</body>

</html>[root@jfht ~]#

[root@jfht ~]# curl -I http://www.sunrisecorp.net/

HTTP/1.1 200 OK

Server: Apache-Coyote/1.1

Accept-Ranges: bytes

ETag: W/"17801-1285643951000"

Last-Modified: Tue, 28 Sep 2010 03:19:11 GMT

Content-Type: text/html

Content-Length: 17801

Date: Tue, 12 Oct 2010 12:49:20 GMT

[root@jfht ~]#

以下是一個tomcat監控腳本的部分内容。

Bash代碼  

# usage: check_once <port> <path>  

# 使用curl檢查網頁是否可以正常通路,如果不能通路就重新開機tomcat。  

check_once()  

{  

        echo  

        echo "$(date)  Tomcat check once"  

        # 2008.08.21 -I/--head -s/--silent  

        #if curl -s -I --connect-timeout 5 --max-time 10 http://localhost:$1/; then  

        # 2010.02.16 add 200 OK test  

        if curl -s -I --connect-timeout 5 --max-time 10 http://localhost:$1/$2 | grep -q '200 OK';  

 then  

                echo "$(date)  Tomcat maybe OK"  

        else  

                echo "$(date)  Tomcat maybe FAULT"  

                restart  

        fi  

}  

# usage: check_loop <port> <path>  

# 每隔一分鐘檢查一次網頁是否正常  

check_loop()  

        while true;  

        do  

                sleep 60  

                check_once $1 $2 >> $CATALINA_HOME/logs/check.$(date +%Y-%m-%d).log  

        done  

# usage: monitor <path>  

# 對path指定的本機網頁進行監控  

# 2008.06.26  

# 2010.09.20 add path parameter  

monitor()  

        PORT=80  

        if grep 'Connector port="80"' $CATALINA_HOME/conf/server.xml; then  

                PORT=80  

        elif grep 'Connector port="8080"' $CATALINA_HOME/conf/server.xml; then  

                PORT=8080  

                echo "Cannot detect server port for Tomcat"  

                return 12  

        echo "Tomcat server port is $PORT"  

        if status; then  

                check_loop $PORT "$1" &  

                #check_loop $PORT "$1"  

-------------------------------------------------------------------------------------------

Curl是Linux下一個很強大的http指令行工具,其功能十分強大。

1) 二話不說,先從這裡開始吧!

$ curl http://www.linuxidc.com

回車之後,www.linuxidc.com 的html就稀裡嘩啦地顯示在螢幕上了    ~

2) 嗯,要想把讀過來頁面存下來,是不是要這樣呢?

$ curl http://www.linuxidc.com > page.html

當然可以,但不用這麼麻煩的!

用curl的内置option就好,存下http的結果,用這個option: -o

$ curl -o page.html http://www.linuxidc.com

這樣,你就可以看到螢幕上出現一個下載下傳頁面進度訓示。等進展到100%,自然就 OK咯

3) 什麼什麼?!通路不到?肯定是你的proxy沒有設定了。

使用curl的時候,用這個option可以指定http通路所使用的proxy伺服器及其端口: -x

$ curl -x 123.45.67.89:1080 -o page.html http://www.linuxidc.com

4) 通路有些網站的時候比較讨厭,他使用cookie來記錄session資訊。

像IE/NN這樣的浏覽器,當然可以輕易處理cookie資訊,但我們的curl呢?.....

我們來學習這個option: -D <— 這個是把http的response裡面的cookie資訊存到一個特别的檔案中去

$ curl -x 123.45.67.89:1080 -o page.html -D cookie0001.txt http://www.linuxidc.com

這樣,當頁面被存到page.html的同時,cookie資訊也被存到了cookie0001.txt裡面了

5)那麼,下一次通路的時候,如何繼續使用上次留下的cookie資訊呢?要知道,很多網站都是靠監視你的cookie資訊,來判斷你是不是不按規矩通路他們的網站的。

這次我們使用這個option來把上次的cookie資訊追加到http request裡面去: -b

$ curl -x 123.45.67.89:1080 -o page1.html -D cookie0002.txt -b cookie0001.txt http://www.linuxidc.com

這樣,我們就可以幾乎模拟所有的IE操作,去通路網頁了!

6)稍微等等    ~我好像忘記什麼了    ~

對了!是浏覽器資訊

有些讨厭的網站總要我們使用某些特定的浏覽器去通路他們,有時候更過分的是,還要使用某些特定的版本     NND,哪裡有時間為了它去找這些怪異的浏覽器呢!?

好在curl給我們提供了一個有用的option,可以讓我們随意指定自己這次通路所宣稱的自己的浏覽器資訊: -A

$ curl -A "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" -x 123.45.67.89:1080 -o page.html -D cookie0001.txt http://www.linuxidc.com

這樣,伺服器端接到通路的要求,會認為你是一個運作在Windows 2000上的 IE6.0,嘿嘿嘿,其實也許你用的是蘋果機呢!

而"Mozilla/4.73 [en] (X11; U; Linux 2.2; 15 i686"則可以告訴對方你是一台 PC上跑着的Linux,用的是Netscape 4.73,呵呵呵

7) 另外一個伺服器端常用的限制方法,就是檢查http通路的referer。比如你先通路首頁,再通路裡面所指定的下載下傳頁,這第二次通路的 referer位址就是第一次通路成功後的頁面位址。這樣,伺服器端隻要發現對下載下傳頁面某次通路的referer位址不是首頁的位址,就可以斷定那是個盜 連了    ~

讨厭讨厭 ~我就是要盜連    ~!!

幸好curl給我們提供了設定referer的option: -e

$ curl -A "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" -x 123.45.67.89:1080 -e "mail.linuxidc.com" -o page.html -D cookie0001.txt http://www.linuxidc.com

這樣,就可以騙對方的伺服器,你是從mail.linuxidc.com點選某個連結過來的了,呵呵呵

8)寫着寫着發現漏掉什麼重要的東西了!——- 利用curl 下載下傳檔案

剛才講過了,下載下傳頁面到一個檔案裡,可以使用 -o ,下載下傳檔案也是一樣。比如,

$ curl -o 1.jpg http://cgi2.tky.3web.ne.jp/~zzh/screen1.JPG

這裡教大家一個新的option: -O 大寫的O,這麼用:

$ curl -O http://cgi2.tky.3web.ne.jp/~zzh/screen1.JPG

這樣,就可以按照伺服器上的檔案名,自動存在本地了!

再來一個更好用的。

如果screen1.JPG以外還有screen2.JPG、screen3.JPG、....、screen10.JPG需要下載下傳,難不成還要讓我們寫一個script來完成這些操作?

不幹!

在curl裡面,這麼寫就可以了:

$ curl -O http://cgi2.tky.3web.ne.jp/~zzh/screen[1-10].JPG

呵呵呵,厲害吧?! ~

9)再來,我們繼續講解下載下傳!

$ curl -O http://cgi2.tky.3web.ne.jp/~{zzh,nick}/[001-201].JPG

這樣産生的下載下傳,就是

~zzh/001.JPG

~zzh/002.JPG

...

~zzh/201.JPG

~nick/001.JPG

~nick/002.JPG

~nick/201.JPG

夠友善的了吧?哈哈哈

咦?高興得太早了。

由于zzh/nick下的檔案名都是001,002...,201,下載下傳下來的檔案重名,後面的把前面的檔案都給覆寫掉了 ~

沒關系,我們還有更狠的!

$ curl -o #2_#1.jpg http://cgi2.tky.3web.ne.jp/~{zzh,nick}/[001-201].JPG

—這是.....自定義檔案名的下載下傳? —對頭,呵呵!

這樣,自定義出來下載下傳下來的檔案名,就變成了這樣:原來: ~zzh/001.JPG —-> 下載下傳後: 001-zzh.JPG 原來: ~nick/001.JPG —-> 下載下傳後: 001-nick.JPG

這樣一來,就不怕檔案重名啦,呵呵

繼續閱讀