天天看點

[SHELL進階] (轉)最牛B的 Linux Shell 指令 (四)

1.檢視ASCII碼表

man 7 ascii 

很多人初學程式設計都會接觸到ascii碼的概念,有時候為了查某個符号的ascii值,可能還得翻箱倒櫃找出當年的課本?Linux Manpage裡面其實包含了很多類似的實用資料,上述指令就能很詳細的方式解釋ascii編碼,當然這裡還有線上版。

man指令的第二個參數是區域碼,用來區分索引詞的範圍,比如printf,在C标準庫裡面的printf跟bash當中的printf是不同的,前者的查詢是man 3 printf,後者是man 1 printf。如果這個區域碼省略,就會從1開始搜尋,直到找到為止。

指令man man可以看到詳細的解釋。

manpages裡面還有一些有趣而且實用的資料,可能鮮為人知:

man 1 intro - 一篇對從未接觸過Linux的使用者的簡明教程。 

man 2 syscalls - 核心系統請求的清單,按核心版本注釋分類,系統程式設計必備。 

man 2 select_tut - 關于select()系統請求的教程。 

man 3 string - 在頭檔案内的所有函數。 

man 3 stdio - 關于頭檔案的使用,标準輸入/輸出庫的說明。 

man 3 errno - 所有errorno的取值及說明。(C語言内類似其他語言的異常告知機制) 

man 4 console_codes - Linux的終端控制碼及其使用解釋。 

man 4 full - 介紹/dev/full這個總是處于"滿"狀态的磁盤。(對應/dev/null這個總是空的裝置) 

man 5 proc - 介紹/proc下的檔案系統。 

man 5 filesystems - 各種Linux檔案系統。

第7區裡面的資料通常最酷:

man 7 bootparam - 詳細解釋核心啟動參數。 

man 7 charsets - 解釋各種語言的編碼集。(gbk,gb2312等) 

man 7 glob - 解釋glob檔案名管理機制的工作過程。 

man 7 hier - 解釋Linux檔案系統結構各個部分的作用。 

man 7 operator - C語言的運算符的清單。 

man 7 regex - 介紹正規表達式。 

man 7 suffixes - 常見檔案字尾名的清單跟解釋。 

man 7 time - Linux的時鐘機制解釋。 

man 7 units - 數值機關及其數值的解釋。 

man 7 utf8 - 描述UTF-8編碼。 

man 7 url - 解釋URL、URI、URN等的标準。

2.簡易計時器

time read

運作指令開始算起,到結束時按一下Enter,就顯示出整個過程的時間,精确到ms級别。

time是用來計算一個程序在運作到結束過程耗費多少時間的程式,它的輸出通常有三項:

$ time ls /opt 

... 

real 0m0.008s 

user 0m0.003s 

sys 0m0.007s 

real指整個程式對真實世界而言運作所需時間,user指程式在使用者空間運作的時間,sys指程式對系統調用鎖占用時間。

read本來是一個讀取使用者輸入的指令,常見用法是read LINE,使用者輸入并回車後,鍵入的内容就被儲存到$LINE變量内,但在鍵入回車前,這個指令是一直阻塞的。

可見time read這指令靈活地利用了作業系統的阻塞。用這個指令來測試一壺水多久煮滾應該是不錯的。

3.遠端關掉一台WINDOWS機器

net rpc shutdown -I IP_ADDRESS -U username%password 

Windows平台上的net指令是比較強大的,因為其背景是一個RPC類的系統服務,大家應該看過win下用net use

file:///C|/ip/ipc%24

 *這樣一個指令建立IPC空連接配接,入侵主機的事情。

Linux下的net指令是samba元件的程式,通常包含在smbclient内,可以跟windows主機的檔案、列印機共享等服務進行通訊,但是也支援rpc指令。

上述指令就是在遠端Windows主機上執行了shutdown指令。當然這不一定成功,關系到win主機上面的安全設定。net指令能夠控制到win主機就是了。

4.在一個子SHELL中運作一個指令

(cd /tmp && ls)

當然這隻是示範,要檢視目錄當然可以ls /tmp。

好處就是不會改變目前shell的目錄,以及如果指令中設計環境變量,也不會對目前shell有任何修改。

在Shell程式設計中還有很多使用上引号來包覆一個指令:`ls /tmp`,這也是子shell過程。可是上引号的方法無法嵌套,而使用小括号的方法可以,一個比較糾結的例子是:

echo $(echo -e 

file:///C|/x%24%28printf

 "%x" 65))

5.利用中間管道嵌套使用SSH

ssh -t host_A ssh host_B

如果目标機器host_B處于比較複雜的網絡環境,本機無法直接通路,但另外一台host_A能夠通路到host_B,而且也能被本機通路到,那上述指令就解決了友善登入host_B的問題。

但理論上這個過程是可以無限嵌套的,比如:

ssh -t host1 ssh -t host2 ssh -t host3 ssh -t host4 ...

嗯那神馬FBI CIA的,有本事來捉我吧~

6.清空螢幕

<CTRL+l>;

這個跟之前介紹的reset指令重置終端的作用有些類似,其實都隻是發送一段控制序列,讓終端的顯示複位。

還可以這樣運作:

tput clear

tput是專門用來控制終端的一個小工具,也挺強大的,詳細資訊運作man tput檢視。

7.我想知道一台伺服器什麼時候重新開機完

ping -a IP 

系統管理者最常做的事情是重新開機系統。但是伺服器的重新開機過程往往得花上好幾分鐘,什麼你的伺服器4個scsi卡?16個硬碟?系統是Redhat?還完全安裝所有元件?好吧,它重新開機的時間都夠你吃頓飯了,是以我很想知道它什麼時候回來。

ping指令有個audible ping參數,-a,當它終于ping通你的伺服器時會讓小喇叭叫起來。

8.列出你最常用的10條指令

history | awk '{a[$2]++}END{for(i in a){print a " " i}}' | sort -rn | head

這行指令組合得很妙: history輸出使用者了指令曆史;awk統計并輸出清單;sort排序;head截出前10行。

9.檢查GMAIL新郵件

curl -u  [email protected]  --silent " https://mail.google.com/mail/feed/atom

" | 

perl -ne \ 

print "Subject: $1 " if /<title>(.+?)<\/title>/ && $title++; 

print "(from $1)\n" if /<email>(.+?)<\/email>/; 

'

Gmail的一個特色是支援Atom feed輸出郵件清單,是以總是見到很多Gmail郵件提醒器之類的,因為開發特簡單,atom很友善。

這裡隻是利用了perl的正則來解析atom(sed/awk也能做到)。

10.用TELNET看《星球大戰》

telnet towel.blinkenlights.nl 

沒什麼好解釋的,就是ASCII藝術之一。如果你有ipv6連接配接,還能看到彩色版的。牛吧?