推薦給開發人員的實用命令列工具

jobbole發表於2012-11-15

  作為一名Web開發者,當程式出現問題時日子總不是那麼好過。問題可能無處不在,可能是你傳送的請求出了錯,可能是回覆出了錯,可能是你使用的某個第三方庫出了問題,又或者是一個外部API呼叫失敗了。優秀的工具對於定位問題出在何處有著無可估量的價值,而且能在一開始就幫助我們阻止問題的出現,總的來說能使我們的工作更有效率。命令列工具尤其有用,因為它們非常易於做自動化和指令碼處理,能夠以各種不同的方式進行組合和重用。本文介紹了6個非常強大且靈活的工具,熟練使用這些工具能使你的生活變得更輕鬆一些。

  Curl

  Curl是一個網路傳輸工具,同wget非常相似。主要的區別在於wget預設是儲存到檔案,而curl將輸出定向到命令列上。這使得curl能非常方便的檢視站點的內容。比如,我們可以從ifconfig.me站點得到我們本機的IP地址:

$ curl ifconfig.me
 
93.96.141.93

 Curl的-i(檢視header)和-I(只顯示header)選項使得除錯HTTP響應以及檢視伺服器究竟傳送給你了什麼變得非常有用:

$ curl -I news.ycombinator.com
HTTP/1.1 200 OK 
Content-Type: text/html; charset=utf-8
Cache-Control: private
Connection: close

  -L選項也很有用,能讓curl自動跟蹤重定向。Curl支援HTTP基本認證,cookies,手動設定headers以及更多有用的功能。

  Ngrep

  如果要分析網路資料包,我們有Wireshark,它有著上千種設定、過濾器以及配置選項。它還有一個命令列版本Tshark。如果只是針對簡單的任務,我覺得Wireshark就太重量級了,所以除非我需要更強大的功能,一般情況下就用ngrep來處理了。Ngrep可以讓你像類似grep處理檔案的方式來處理網路封包。

  針對Web流量,你幾乎總是想要加上-W byline選項,這會保留換行符,而-q選項可以抑制某些非匹配資料包而產生的輸出。下面是一個抓取所有包含有GET或POST請求資料包的例子:

ngrep –q –W byline “^(GET|POST) .*”

  你也可以傳入附加的報文過濾選項,比如限制匹配的報文只針對某個特定的主機,IP或埠。這裡我們把所有流經Google的流量做一個過濾,只針對80埠且報文中包含“search”。

ngrep –q –W byline “search” host www.google.com and port 80

  Netcat

  Netcat或者叫nc,這是一個自稱是網路中的瑞士軍刀般的工具。它很簡單但也非常強大和靈活,允許你建立任意的網路連線。這裡我們來看看如何把它作為一個埠掃描器:

$ nc –z example.com 20-100
Connection to example.com 22 port [tcp/ssh] succeeded!
Connection to example.com 80 port [tcp/ssh] succeeded!

  除了能夠建立任意的連線,Netcat還能夠監聽傳入的連線。這裡我們利用nc的這個功能再配合tar來快速有效的在伺服器之間拷貝檔案。在伺服器端,執行:

$nc –l 9090 | tar –xzf –

  在客戶端執行:

$tar –czf dir/ | nc server 9090

  我們可以使用Netcat把任何應用通過網路暴露出來,這裡我們通過8080埠將shell暴露出來:

$ mkfifo backpipe
$ nc –l 8080 0<backpipe | /bin/bash > backpipe

  現在我們可以通過任意一臺客戶機來訪問伺服器了:Linode

$ nc example.com 8080
uname –a
Linux li228-162 2.6.39.1-linode34 ##1 SMP Tue Jun 21 10:29:24 EDT 2011 i686 GNU/Linux

  儘管後面這兩個例子有些投機取巧的成分(現實中你應該使用類似rsync這樣的工具來拷貝檔案,用SSH來遠端登入伺服器),它們還是展示出了Netcat的強大和靈活,通過結合netcat和其它的應用你可以實現很多不同的事情。

  推薦閱讀:《8 個實用的 Linux netcat 命令示例

  Sshuttle

  Sshuttle允許你通過任意一臺可SSH訪問的伺服器來為你的流量建立安全的隧道。搭建和使用都非常簡單,不需要你在伺服器上安裝任何軟體或者修改任何本地代理設定。當你在非安全的公共WiFi或其他不受信任的網路中時,通過SSH讓流量走安全隧道,這樣就可避免類似Firesheepdsniff這樣的工具的侵擾。所有的網路通訊,包括DNS請求都會傳送到你的SSH伺服器:

$ sshuttle –r <server> --dns 0/0

  如果你提供了—daemon引數,sshuttle會以守護程式的形式在後臺執行。結合一些其他的選項,你可以使用別名形式來簡單快速的啟動和停止安全隧道:

alias tunnel=’sshuttle –D –pidfile=/tmp/sshuttle.pid –r <server> --dns 0/0’
alias stoptunnel=’[[ -f /tmp/sshuttle.pid ]] && kill `cat /tmp/sshuttle.pid`’

  你也可以使用sshuttle來解決一些基於IP的地理定位篩選的問題,如今有很多服務都在使用這種應用比如BBC的iPlayer就需要你在英國,還有Turntable,需要你在美國。要繞過這種限制,你需要訪問到位於該國的某個伺服器。Amazon在許多國家都有免費的E2C微例項,或者你也可以找一個便宜的vps,幾乎世界上任何國家都有。

  在這個例子中,我們不需要讓所有的流量都走隧道,我們只需要針對目標服務的流量就行了。

  不幸的是sshuttle只接受IP地址作為引數,不支援主機名,所以我們還得先用dig來解析出主機名。

$ sshuttle –r <server> `dig +short <hostname>`

  Siege

  Siege是一個HTTP基準測試工具。除了負載測試功能外,它還有一個很方便的-g選項,這非常類似於curl的-iL,只是這裡Siege也會輸出請求header。這裡是針對Google的一個例子(為了簡潔我拿掉了一些header)

$ siege -g www.google.com 
GET / HTTP/1.1 
Host: www.google.com 
User-Agent: JoeDog/1.00 [en] (X11; I; Siege 2.70)
Connection: close  
 
HTTP/1.1 302 Found 
Location: http://www.google.co.uk/ 
Content-Type: text/html; charset=UTF-8 
Server: gws 
Content-Length: 221 
Connection: close  
 
GET / HTTP/1.1 
Host: www.google.co.uk 
User-Agent: JoeDog/1.00 [en] (X11; I; Siege 2.70) 
Connection: close  
 
HTTP/1.1 200 OK 
Content-Type: text/html; charset=ISO-8859-1 
X-XSS-Protection: 1; mode=block 
Connection: close

  Siege真正在行的是伺服器的負載測試。就像ab(一款Apache HTTP服務基準測試工具)一樣,你可以向站點傳送併發請求,並檢視它如何處理流量。用下面的命令,我們會在30秒內向Google發起20個併發連線,最後會得到一個漂亮的測試報告。

$ siege -c20 www.google.co.uk -b -t30s 
...
Lifting the server siege... done. 
Transactions: 1400 hits 
Availability: 100.00 % 
Elapsed time: 29.22 secs 
Data transferred: 13.32 MB 
Response time: 0.41 secs 
Transaction rate: 47.91 trans/sec 
Throughput: 0.46 MB/sec 
Concurrency: 19.53 
Successful transactions: 1400 
Failed transactions: 0 
Longest transaction: 4.08 
Shortest transaction: 0.08

  Siege最有用的一個特性是它可以把一個記錄URL的檔案作為輸入,然後“點選”這些URL,而不是隻處理一個單獨的頁面。這對於負載測試來說很有用,因為你可以對站點重現真實的流量並觀察站點如何處理,而不必一遍又一遍重複點選同一個URL。下面是你用Siege來重現Apache對另一臺伺服器的日誌記錄,以做負載測試的例子:

$ cut -d ' ' -f7 /var/log/apache2/access.log > urls.txt 
$ siege -c<concurrency rate> -b -f urls.txt

  Mitmproxy

  Mitmproxy是一個支援SSL的HTTP中間人代理工具,它允許你檢查HTTP和HTTPS流量並支援直接改寫請求。這個應用曾經在一些有關iOS應用的隱私醜聞中都出現過,包括Path的地址簿上傳醜聞。它的直接改寫請求的能力也被用來針對iOS平臺,其應用包括在GameCenter中偽造一個虛假的高分數值

  Mitmproxy可不只是用來檢視移動應用傳送了些什麼內容或者是偽造幾個高分數值那麼簡單。它同樣可以為Web開發者解決很多問題。比如,之前我們需要不停點選F5鍵或者清除快取才能保證看到最新的內容,現在你可以執行:

$ mitmproxy --anticache

  這樣將自動去掉快取控制相關的header,並確保你總是獲取到重新整理後的內容。不幸的是,這並不會像sshuttle那樣自動為你設定轉發功能,所以啟動mitmproxy之後你還需要修改全域性或者特定於瀏覽器的代理設定。

  mitmproxy另一個非常給力的功能是記錄並重現HTTP的互動過程。官方文件給出了一個關於無線網路登入的例子。同樣的技術也能夠用來作為基本的Web測試框架。比如,為了確認你的使用者註冊流程是否正常工作,你可以開啟記錄會話:

$ mitmdump -w user-signup

  然後跑一遍使用者註冊流程,目前為止應該能如預期般的工作。用Ctrl+C來停止記錄。在任意時刻我們都能重現剛剛記錄到的互動過程,並檢查200狀態碼:

$ mitmdump -c user-signup | tail -n1 | grep 200 && echo "OK" || echo "FAIL"

  如果註冊流程中的任意一點出了問題,我們將看到FAIL訊息而不是OK。你可以建立一整套這類測試套件,並經常執行這類測試以確保當站點突然出現故障時你會得到提示。

 作者簡介

  Ben Dowling是一名英國的軟體工程師,現居住在加州的Mountain View。他的部落格地址是coderholic.com 推特賬號是@coderholic

  英文原文:Ben Dowling ,編譯:伯樂線上—— 陳舸

相關文章