文、小州老師

1743c033e44e837a6686f7a42821a0dc  

      話說啊不知不覺啊!自己在 Linux 系統已經用了超過 10 年時間,大多時間都是 ssh 方式遠端方式登入Linux 來操作使用,所以文字介面操作已經變成每天的習慣。目前大多 Linux 發行版本預設使用的 shell,就是 bash,所以下面來聊一下 bash shell 操作下一些有趣的使用內容。

《小技巧使用篇》

1. 寫 shell script

     在系統上有時候要進行某個工作,由於要完成的事情很多無法直接手動敲命令完成,那這時候就會直接把需求寫成shell script 來完成。不過 shell script 寫好後常常要測試一下是否可以使用,偶而會遇到可能是呼叫的命令與參數有問題導致 script 執行時候顯示有錯誤,這時候可以使用 bash 搭配 -x 參數進入的除錯模式來查看問題點。

比方寫 iptables firewall 規則時候,程式碼如下:

 #!/bin/bash

 iptables -F
 iptables -X
 iptables -A INPUT -i lo -j ACCEPT
 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

使用 bash -x custom_firewall.sh 執行時候會顯示:

 + iptables -F
 + iptables -X
 + iptables -A INPUT -i lo -j ACCEPT
 + iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

若是當初把 iptables -X 誤打成為 iptables -x,一般執行 script 時候只會看到顯示:

 iptables v1.4.7: no command specified

那搭配 bash -x 方式來執行可以看到:

 + iptables -F
 + iptables -x
 iptables v1.4.7: no command specified
 Try `iptables -h' or 'iptables --help' for more information.
 + iptables -A INPUT -i lo -j ACCEPT
 + iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

     至少可以知道哪一行輸入錯誤,更容易快速找到問題。另外也可以使用 bash -n 檢查script 檔案本身有無 shell 相關本身語法錯誤的問題,而不需要執行期時候才知道。

2. 重複之前輸入的命令敘述

     話說上面寫了一個 firewall.sh 放置在 /home/alex/bin 目錄內,所以目前要直接執行 /home/alex/custom-firewall.sh檔案,因為權限不足所以畫面出現一堆錯誤訊息,解決方式通常就是搭配 sudo 方式來執行,比方是:

 sudo /home/alex/bin/custom-firewall.sh
   
     不過若是剛剛直接執行 /home/alex/bin/custom-firewall.sh 出現錯誤時候,可以直接這樣輸入就可以達成一樣效果:

 sudo !!
 
     在 bash 下使用 readline 程式庫管理輸入的功能,而使用 !! 表示最近執行的命令,所以透過該方式就可以直接用 sudo 重複執行該命令敘述而不需要把命令叫出來修改加上 sudo,對於操作上會有很多便利性。

3. 命令列相關組合按鍵

     命令列下大多大家已經習慣使用方向鍵移動游標進行移動操作,不過可以搭配如下的按鍵可以快速達成方位移動。

 Ctrl-A 與 Ctrl-E : 移動到行首與行尾。
 Ctrl-U 與 Ctrl-K : 刪除游標開始至首所有字元 / 刪除游標開始至尾所有字元。
 
     另外有時候執行某個敘述命令會一直輸出很多訊息,若是要暫停訊息一直由螢幕顯示出來的話可以按下 Ctrl-S 暫停,後續按下 Ctrl-Q 按鍵可以繼續剛剛暫停狀態。
當執行命令若是訊息輸出超過一頁,也可以使用 Shift-PageUP 與 Shift-PageDown 達成往前與往下捲頁的功能提供瀏覽。

D006.jpg

4. 找之前輸入過的命令來執行

      對於之前輸入過的命令通常都可以使用上下鍵方式查看之前輸入過的命令,或者是使用 history 方式查看所需要的內容後,用剪貼複製方式再次執行。對於 history 輸出的命令清單內都會加上編號,所以可以使用 !n 方式來再次執行。比方使用 !100 ,就是執行 history 內編號為 100 的命令。

      另外還有一種使用方式像是: !vi 也就是搜尋最近命令列執行以 vi 開頭的敘述的命令項目。比方剛剛之前曾經有輸入執行 vi file.txt 的話,使用該命令就表示可以再次使用 vi 編輯 file.txt 檔案。另外個人很常用 ctrl r 按鍵功能,這表示使用遞增方式往前搜尋歷史清單內曾經輸入過命令敘述。比方命令列之前曾經輸入過像是這樣命令:

 cp firewall.sh firewall-bak.sh
 vi firewall.sh
 chmod a+x firewall.sh
 bash -x firewall.sh
 
      那按下 ctrl-r 時候輸入 f 字串就會出現 bash -x firewall.sh 項目,若是需要這個就可以直接執行。若是按下 ctrl-r輸入 c 字元會出現 chmod a+x firewall.sh。若是按下 ctrl-r 輸入 cp 就變成上面複製檔案的命令敘述了。
其實 shell 下 ctrl 組合按鍵系列的功能很多,使用上都有意想不到的結果 :)

5. 路徑使用

     常常系統操作上會需要建立一個目錄,然後切換到該目錄內操作,比方:

 mkdir -p ~/project/2012/05
 cd ~/project/2012/05

     實際操作上會先執行 mkdir 那行敘述,然後我們會按下向上鍵修改一下剛剛命令把 mkdir -p 刪除後加上 cd 來進行目錄切換的功能。該操作方式可以透過 bash 本身的 $_ 變數來簡化操作。

 mkdir -p ~/project/2012/05
 cd $_
 
      其中 $_ 這個變數是取得上個命令敘述最後一個引數內容,所以等於 ~/project/2012/05,簡化與加快操作目錄切換的過程。


4. 簡易網路連結

      bash 本身也具備連結網路的功能,雖然不是很常使用但是卻顯得意外有趣。bash 本身支援如下項目存取網路:

 /dev/tcp/host/port : 表示存取 host 該 tcp 協定的 port 位置
 
 /dev/tcp/host/port : 表示存取 host 該 tcp 協定的 port 位置
 
     這個檔案名稱可以搭配在 IO 重導內使用,比方如下範例可以達成類似 nmap 程式探測 port 是否開啟的方式:

 for port in {1..100}
 do
  echo abc >/dev/tcp/www.hinet.net/$port && echo "host port $port is open" || echo "host port $port is closed"
 done > output.txt
 
最後 output.txt 可以看到如下結果:

...
 host port 78 is closed
 host port 79 is closed
 host port 80 is open
 host port 81 is closed
 host port 82 is closed
 host port 83 is closed
...
 
    另外一個例子,使用 exec 建立一個檔案代碼為 6 的檔案描述子與
www.hinet.net port 80 產生連結,後續對該檔案描述子下達 GET / HTTP/1.0 的 HTTP 命令取得網頁內容,最後取出回應網頁內容並顯示出來。

 exec 6<> /dev/tcp/www.hinet.net/80
 echo -e "GET / HTTP/1.0\n\n" >&6
 cat <&6
 
    不過是否有感覺用起來還是不大順利的感覺呢?其實實際應用上若要存取網路可以使用適當的工具達成似乎比較簡單與方便,上述方式倒是可以順便熟悉一下 IO Redirection 的一些使用議題方式。
最後:其實 GNU 的 bash shell 有非常多功能,上面簡單介紹了一些比較有趣的功能項目,若是對 bash 想了解更多的話,可以 參考 bash 的 info page 有完整 manual 說明。
 
  info bash
 
   若系統有 pinfo 工具,可以用 pinfo 替代 info 會更好操作閱讀。當然,也可以直接閱讀網路版本:
http://www.gnu.org/software/bash/manual/bash.html另外歡迎大家加入 Google+ 內的 "Linux Tips" 圈圈,裡面有很多很棒的 Tips 知識分享,可以獲得許多斬獲 :)

小編題外話:黏成一團 google+也歡迎來參觀喔!

2011-10-27-3.gif      

, , ,

lccnetvip 發表在 痞客邦 PIXNET 留言(7) 人氣()


留言列表 (7)

發表留言
  • KENDU
  • 小州老師神人級了
    好深奧的分享
    讚啦
  • pop
  • 感謝老師不吝分享唷!!幫你推一個~~
  • 謝謝對聯成老師的肯定~

    lccnetvip 於 2012/09/10 11:04 回覆

  • 無字天師
  • 老師的教學還是一樣的讓人獲益良多呀^^
  • 沒錯啊~~這裡的文章可是老師們的用心力作~感謝肯定。

    lccnetvip 於 2012/09/10 11:03 回覆

  • Sin-Yi Lin
  • 謝謝老師的心得分享,一些Linux指令介紹很詳盡。
  • 謝謝對聯成老師的讚美~

    lccnetvip 於 2012/09/10 11:01 回覆

  • LL
  • 好詳細的內容阿!! 真的是一篇好文章..
  • 小州老師的用心之作啊^^

    lccnetvip 於 2012/09/10 11:01 回覆

  • RELAX
  • 老師講解得好好詳細阿,讓我不禁伸起大拇指比個讚阿
  • 謝謝對老師的讚美~~

    lccnetvip 於 2012/09/11 09:12 回覆

  • jack
  • 獲益良多唷!!謝謝分享
  • 不客氣喔~~~

    lccnetvip 於 2012/09/17 10:09 回覆