我使用過的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
這樣一來,就不怕檔案重名啦,呵呵