顯示具有 linux 標籤的文章。 顯示所有文章
顯示具有 linux 標籤的文章。 顯示所有文章

2013年6月3日 星期一

Shell Scripting常用範例說明

建議開頭
#!/bin/bash
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
export LANG="en_US.UTF-8"
註解
#user comment
定義變數與列印變數
VAR="hello world"
echo $VAR

printf "\33[1;31m"
printf "Color Version: $VAR"
printf "\33[0m\n"
正常結束
exit 0
if-else判斷式
if [ "$INPUT" == "Yes" ]; then
  echo "result is Yes"
elif [ "$INPUT" == "No" ]; then
  echo "result is No"
else
  echo "wrong input"
fi
讀取argument
if [ ! -z "$1" ]; then
  ARGS=$1
fi
echo $ARGS
檢查執行者身份
whoami_ret="$(whoami)"
if [ "$whoami_ret" != "root" ]; then
  echo "This script must be run as root"
  exit
fi
使用者輸入
read -p "Please input (Y/N), default is N:" ANSWER
if [ "$ANSWER" == "Y" -o "$ANSWER" == "y" ]; then
  echo "result is Yes"
fi
執行指令的結果
pyOpenSSL_ret="$(rpm -q python-openssl | grep install | wc -l)"
if [ "$pyOpenSSL_ret" == "1" ]; then
  echo "python-openssl is not installed, please install python-openssl"
  exit
fi  
類似traverse陣列
SERVER_LIST=(192.168.0.1 192.168.0.2 192.168.0.3)
for IP in ${SERVER_LIST[@]}
do
  echo "IP address: $IP"
done
Switch case
case $CAR in
  AUDI | audi)
    echo "audi"
  ;;
  VOLVO | volvo)
    echo "volvo"
  ;;
  BENZ | benz)
    echo "benz"
  ;;
  *) 
    echo "wrong role type"
    exit
  ;;
esac
Loop
until [ "$ANSWER" == "yes" ]
do
  read -p "Please input \"yes\":" ANSWER
done

i=0
while [ "$i" != "10" ]
do
  i=$(($i+1))
  echo $i
done

for CAR in AUDI VOLVO BENZ
do
 echo ${CAR}
done

for i in $(seq 1 10)
do
  echo ${i}
done

for (( i=1; i<=10; i=i+1 ))
do
  echo $i
done
等候某個事件發生
FILE_EXISTED=0;
while [ $FILE_EXISTED -ne "1" ]; 
do
  if [ -z "/root/test_file" ];then
    FILE_EXISTED=1
  fi
  sleep 1;
done
Function
function PRINT_FUNCTION(){
  echo "args is $1"
}

PRINT_FUNCTION "first_args"
參考 http://tldp.org/LDP/abs/html/ http://linux.vbird.org/linux_basic/0340bashshell-scripts.php

2013年5月29日 星期三

screen基本指令教學

screen是個簡單方便的terminal console管理工具,大概有幾個主要的優點:
  • 在一個terminal軟體中開啟許多子console視窗
  • 可以dettach出來、之後又reattach回去
  • 有scrollback的功能
  • console視窗間複製貼上
  • 切割console視窗

安裝

在Ubuntu上直接 $ sudo apt-get install screen就可以了

Command-line指令

$ screen
  • 直接開啟新的session
$ screen -list
  • 列出目前有哪些已經存在的session可以attach進去
$ screen -R
  • reattach回session。如果目前沒有session存在,直接就地開啟一個新的session。如果有好幾個不同的session,使用screen -R
$ screen -U
  • 以utf-8 mode執行
$ screen -d
  • 強制將某個正在被attach中的session給detach掉
$ screen -wipe
  • 將廢棄的screen清除

Key-Binding指令

screen預設是以Ctrl-a(同時按住鍵盤Ctrl跟a兩個按鈕,如果您能理解控制字元,這就是等同於"^A")來啟動console視窗管理,接著同時鬆開Ctrl與a鍵,按下另一按鍵或下達指令來進行操作。

Ctrl+a c
  • 開啟一個新的console視窗
Ctrl+a Ctrl+a
  • 連續兩次,回到上一個console視窗
Ctrl+a [1~9]
  • 切換到1號至9號的某個console視窗
Ctrl+a "
  • 列出目前所有視窗,可用上下方向鍵選擇要進入的console視窗,按下enter進入
Ctrl+a k
  • 刪除目前的console視窗
Ctrl+a d
  • 將目前session給detach掉
Ctrl+a Esc
  • 進入copy mode,可用上下左右操控或進行scrollback。/或?用來搜尋(類似vim)。空白鍵可進行選取,決定範圍後按下第二次空白鍵就會複製入buffer中。之後使用Ctrl+]就可以將剛剛screen放入buffer中的內容貼上
Ctrl+a :sessionname [name]
  • 設定session的名稱,之後在comman-line模式執行screen -list方便檢視
Ctrl+a v
  • [Ctrl+a] 輸入控制字元Ctrl+a(因為Ctrl+)
Ctrl+a S
  • 將目前所在區域,水平分割成另外兩個區域
Ctrl+a Q
  • 關閉分割區域
Ctrl+a Tab
  • 切換分割區域

進階議題

  • 在screen的vim中輸入控制字元^A,需要在vim中進入insert模式,然後按下Ctrl+A,再按下a,就可以了
  • 因為screen畫面有些單調,有時無法辨別目前console視窗的狀態與session的狀態。如果需要像bash一樣有客製化的畫面,可以透過設定編輯~/.screenrc這個檔案來得到自己想要的效果。只要上Google搜尋screenrc就有許多範本可以下載,有空我再來寫篇screenrc教學。
  • 垂直分割screen區域(需要拿git版screen重make自己build)
    • $ git clone git://git.savannah.gnu.org/screen.git
    • $ cd screen/src
    • $ ./autogen.sh
    • $ ./configure
    • $ make
    • $ make install
    • 使用Ctrl+a | 來垂直分割區域
    • 參考 http://savannah.gnu.org/projects/screen/

2012年8月7日 星期二

Linux Shell Command Logger

1. 新增下列到/etc/bashrc中
export PROMPT_COMMAND='RETRN_VAL=$?;logger -p local6.debug "$(whoami) [$$]: $(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//" ) [$RETRN_VAL]"'
若您使用的是ubuntu,則檔案為/etc/bash.bashrc。若使用centos,檔案為/etc/profile
ps. /etc/profile或/etc/bashrc等檔案要視順序設定,可參考http://www.51testing.com/?uid-225738-action-viewspace-itemid-216622

2. 新增下列到/etc/syslog.conf
local6.*                /var/log/commands

3. 若需要log rotate,則新增/var/log/commands這行到/etc/logrotate.d/rsyslog中 (以ubuntu為例,若您使用centos則是/etc/logrotate.d/syslog)

4. 參考資料
http://blog.kxr.me/view/classic
http://efreedom.com/Question/6-93566/Log-Bash-Commands-Users-Server