2010年9月3日 星期五

超強大的 Bash - Networking 支援

Standard
當全世界都在瘋各種擴充性多元的 Script 語言時,所有人便開始遺忘 Unix 上古老的 Shell script,的確,和當今主流的 Python 、Perl 等語言相比,Bash 像個醜小鴨,但是不可否認,其功能和 footprint 的相對價值遠超過其他 script 語言甚多,因此在大多數 Linux 發行版之中,仍然會預設安裝 Bash 。

也因為 Bash 被太多人忽視了,很少人知道, Bash 其實也可以操作 Networking,舉例來說,可以一行指令便連上時間伺服器,透過 Daytime Protocol (RFC-867) 取得目前的標準時間:
$ cat </dev/tcp/time.nist.gov/13

55442 10-09-03 11:19:58 50 0 0 839.8 UTC(NIST) *

Bash 內建了這樣的功能,讓使用者可以透過讀寫 /dev/proto/host/port 的方式去操作網路連線,當然這路徑並不真實存在於系統中,所以透過其他的 script 或程式是無法存取。瞭解有這樣的功能後,我們也可以去試著去抓取網頁內容:
$ exec 3<> /dev/tcp/www.google.com/80
$ echo -e "GET / HTTP/1.1\r\nhost: http://www.google.com\r\nConnection: close\r\n\r\n" >&3
$ cat <& 3
HTTP/1.1 404 Not Found
Content-Type: text/html; charset=UTF-8
X-Content-Type-Options: nosniff
Date: Fri, 03 Sep 2010 11:40:10 GMT
Server: sffe
Content-Length: 1354
X-XSS-Protection: 1; mode=block
Connection: close



<html><head>
... 內容省略
</body></html>

後記

使用 Shell script 是一種身為 Linux/BSD 等 Unix's like 系統工程師的基本技能,比起其他語言,其更為重要,況且現在的 Bash 已經有相當多的支援,足以讓我們做各種應用。