2008年7月31日 星期四

Linux commands 一覽

Linux commands 一覽

來源網站


• Linux命令:Accept
• Linux命令:Atq
• Linux命令:Bg
• Linux命令:Bunzip2
• Linux命令:Bzip2
• Linux命令:Chattr
• Linux命令:Chgrp
• Linux命令:Clear
• Linux命令:Colrm
• Linux命令:Comm
• Linux命令:Cut
• Linux命令:Dd
• Linux命令:Df
• Linux命令:Diff3
• Linux命令:Factor
• Linux命令:Fc
• Linux命令:Finger
• Linux命令:Fmt
• Linux命令:Fold
• Linux命令:Fuser
• Linux命令:Gencat
• Linux命令:Halt
• Linux命令:Head
• Linux命令:Hostname
• Linux命令:Jobs
• Linux命令:Join
• Linux命令:Kill
• Linux命令:Ldd
• Linux命令:Less
• Linux命令:Lex
• Linux命令:Ln
• Linux命令:Locate
• Linux命令:Look
• Linux命令:Lsmod
• Linux命令:Man
• Linux命令:Mcd
• Linux命令:Mkdir
• Linux命令:More
• Linux命令:Mv
• Linux命令:Newgrp
• Linux命令:Nfsstat
• Linux命令:Nl
• Linux命令:Passwd
• Linux命令:Paste
• Linux命令:Pathchk
• Linux命令:Pstree
• Linux命令:Ptx
• Linux命令:Reboot
• Linux命令:Reject
• Linux命令:Shutdown
• Linux命令:Sort
• Linux命令:Sudo
• Linux命令:Tail
• Linux命令:Tc
• Linux命令:Tee
• Linux命令:Timeconfig
• Linux命令:Top
• Linux命令:Tree
• Linux命令:Tty
• Linux命令:Umask
• Linux命令:Uname
• Linux命令:Uniq
• Linux命令:Unzip
• Linux命令:Uptime
• Linux命令:Wc
• Linux命令:Whereis
• Linux命令:Which
• Linux命令:Whois
• Linux命令:Yes
• Linux命令:Ypcat
• Traceroute

Shell script Examples

Shell script Examples

轉貼自此


SH 教學
1. 一個簡單的例子

#!/bin/sh
echo "** Non-root UID=0 or GID=0 accounts:"
grep ':00*:' /etc/passwd | \
  awk -F: 'BEGIN        {n=0}
           $1 != "root" {print $0 ; n=1}
           END          {if (n==0) print "None found."}'


---------------------------------------------------------------------
2. shift 的用法,及一些特殊符號的意義

#!/bin/sh
echo $1 $2 $3
echo $#
# will be 4
shift
echo $1 $2 $3
echo $#
# will be 3
#  "$*" = "$1 $2 $3....$n"
echo $*
#  "$@" = "$1" "$2" "$3" "$4" ..."$n"
echo $@
#
# $?  Exit status of previous command
# $$  PID of this shell's process
# $!  PID of the most recently started backgroup job
echo $?
echo $$
echo $!


---------------------------------------------------------------------
3. 變數設定的方法,及特殊設定

#!/bin/sh
item=aaaa
item1=bbbb
echo ${item}1 $item1
#!/bin/sh
name=rache1
echo ${name-tatiana}
# show rache1

echo ${name2-tatiana}
# show tatiana

echo ${name=tatiana}
# show rache1

echo ${name2=tatiana}; echo $name2
# show tatiana
#      tatiana

dir=${name5-`pwd`}; echo $dir


---------------------------------------------------------------------
4. if 的用法,有很多比較方法 -s, -r, -f, -d .. 請看 man if or man test
   例如:底下兩敘述是相同的
   if test -z "$var"; then ...
   if [ -z "$var" ]; then ...

#!/bin/sh
# in sh , echo -n 只有當 /usr/ucb 路徑在 /usr/bin 之前才有用

if [ -f /usr/bin/ls ]; then
  echo -n " ls command found "
fi

#!/bin/sh
strings /vmunix | grep UNIX > /tmp/motd
head -1 /etc/motd | grep UNIX > /tmp/th
if [ -z /tmp/th ]
then
  cat /etc/motd >> /tmp/motd
else
  tail +2 /etc/motd >> /tmp/motd
fi
mv /tmp/motd /etc/motd


---------------------------------------------------------------------
5. 再看一個加上變化的 if

#!/bin/sh
set `who -r`
if [ $9 = "S" ]; then
  echo "The system is coming up. Be patient."
elif [ $7 = "2" ]; then
  echo "Changing to state 2."
else
  echo "Changing to state 3."
fi

底下是更多的 if 的例子
if [ $9 = "S" ]
if [ -s /etc/ptmp ]
if [$# -lt 4 ]
if [ ! -f /etc/.fscksk ]
if [ $? -eq 0 ]
if [ $? -ne 0 ]
if test -z "$var"
if [ -z "$var" ]

---------------------------------------------------------------------
6. 還是 if 的例子

#!/bin/sh
pid=`/bin/ps -e | grep 'lpsched$' | sed -e 's/^  *//' -e 's/ .*//'`
echo ${pid}
if [ "${pid}" != "" ]
then
  echo $pid
  /bin/kill ${pid}
fi

if [ -r /fastboot ]; then
  echo "skip the fsck"
else
  echo "do the fsck"
fi

if [ -d /etc/rc0.d ]
then
  echo "run the K files"
fi

if [ -x /etc/inetd ]
then
  echo "inetd"
fi

if [ "${BOOT}" = "yes" -a -d /etc/rc0.d ]
then
  echo "run /etc/rc0.d"
fi  



---------------------------------------------------------------------
7. while 的語法,與讀進參數

#!/bin/sh
cat /etc/vfstab |
while read DEVICE MOUNT_DIR READONLY FS DUMMY1 DUMMY2
do
  echo "$DEVICE, $MOUNT_DIR, $READONLY, $FS, $DUMMY1, $DUMMY2"
done


---------------------------------------------------------------------
8. case 的用法,和 csh 真的差很多
   $? 是執行命令後的 return status , 0: succeed , 1: false

#!/bin/sh
#/etc/fsck -p > /dev/console
ls / > /dev/null
case $? in
  0)
    echo "return 0"
    ;;
  2)
    exit 1
    ;;
  4)
    echo "return 4"
    ;;
  *)
    echo "Unknown error in reboot" > /dev/console
    exit 1
    ;;
esac
  
---------------------------------------------------------------------
9. 再一個 case 的範例

# can get the same result when "$1" or $1
#case $1 in
case "$1" in
   'start')
           echo "start"
           ;;
   'stop')
           echo "stop"
           ;;
   '-abc')
           echo "-abc option"
           ;;
   '-h'|'-help')
           echo "help option"
           ;;
   *)
           echo "usage: $0 {start|stop}"
           ;;
esac

echo "--------------------------------------------"

shell=tcsh
case $shell in
  *csh)
     echo "C-shell style shells are not acceptable"
     ;;
  *zsh)
     echo " zsh is not acceptable"
     ;;
esac


---------------------------------------------------------------------
10. 一個 for 的簡單例子

#!/bin/sh
for d in /tmp /usr/tmp /tmp/tmp ; do
  echo $d
done


---------------------------------------------------------------------
11. 同樣的 for , 以 *.sh 代替

for file in *.sh ; do
  wc -l $file
done


---------------------------------------------------------------------
12. 取得使用者回答的範例

echo "fsck all disks? [y] \c"
read ans
#echo $ans
if [ $ans = 'y' -o $ans = 'Y' ] ; then
  echo "Yes"
else
  echo "no.."
fi


---------------------------------------------------------------------
13. 迴圈 while ,這個例子會印出 1 2 3 4 5

#!/bin/sh
i=1
while [ $i -le 5 ]; do
  echo -n $i
  i=`expr $i + 1`
done

---------------------------------------------------------------------
14. 一個字串連結的例子 $a$b$c = cmd , 又 cmd = date

#!/bin/sh
a=c; b=m; c=d; cmd=date
eval $`echo $a$b$c`

---------------------------------------------------------------------
15. 這個例子會列出目前目錄下的子目錄名稱

#!/bin/sh
# usage: process sub-directory
dir=`pwd`
for i in *; do
  if [ -d $dir/$i ]
  #if test -d $dir/$i

  then
    cd $dir/$i
#    while (echo -n "$i: (waiting command") ; read x; do
#      eval $x
#    done
    echo $i
    cd ..
  fi
done

---------------------------------------------------------------------
16. 更改檔名  *.html -> *.htm

#!/bin/sh
for i in *.html ; do
  echo $i
  mv $i `basename $i .html`.htm
done

----------------------------------------------------------------------
17. 更改檔名 *.htm -> *.html

#!/bin/sh
for i in *.htm ; do
  echo $i
  mv $i `basename $i .htm`.html
done

----------------------------------------------------------------------
18. 一個抓下來的片段

  while [ $# != 0 ]
  do
    case $1 in
     -v) doversion=1;;
     -B) BASEDIR=$2; shift;;
     -l) LOGDIR=$2; shift;;
     -w) WORKDIR=$2; shift;;
     -B) BINDIR=$2; shift;;
     -c) RCFILE=$2; shift;;
     -e) EXPLAINREPORT=I;;
     -E) EXPLAINREPORT=Y;;
     -S) SERVERCHECK=Y;;
     -O) OS=$2; shift;;
     -A) ARCH=$2; shift;;
     -R) REV=$2; shift;;
     -t) Tiger_TESTMODE=Y;;
      *) echo "--ERROR-- [con006e] Unknown option $1";;
    esac
    shift;
  done

----------------------------------------------------------------------
19. 一個實際設定 Solaris 2.x Ftp server 的 shell script

#!/bin/sh
# script to setup SunOS 5.3 anonymous ftp area
#
#set OS_VERSION = `uname -r`
# handle the optional command line argument
case $# in

  # the default location for the anon ftp comes from the passwd file
  0) ftphome="`grep '^ftp:' /etc/passwd | cut -d: -f6`"
     ;;

  1) if [ "$1" = "start" ]; then
        ftphome="`grep '^ftp:' /etc/passwd | cut -d: -f6`"
     else
        ftphome=$1
     fi
     ;;

  *) echo "Usage: $0 [anon-ftp-root]"
     exit 1
     ;;
esac

if [ -z "${ftphome}" ]; then
   echo "$0: ftphome must be non-null"
   exit 2
fi

# This script assumes that ftphome is neither / nor /usr so ...
if [ "${ftphome}" = "/" -o "${ftphome}" = "/usr" ]; then
   echo "$0: ftphome must not be / or /usr"
   exit 2
fi

# If ftphome does not exist but parent does, create ftphome
if [ ! -d ${ftphome} ]; then
    # lack of -p below is intentional
    mkdir ${ftphome}
fi

echo Setting up anonymous ftp area ${ftphome} for SunOS `uname -r`
#echo Setting up anonymous ftp area ${ftphome} for SunOS $OS_VERSION

# Ensure that the /usr/bin directory exists
if [ ! -d ${ftphome}/usr/bin ]; then
   mkdir -p ${ftphome}/usr/bin
fi

cp /usr/bin/ls ${ftphome}/usr/bin

chmod 111 ${ftphome}/usr/bin/ls

# Now set the ownership and modes to match the man page
chown root ${ftphome}/usr/bin
chmod 555 ${ftphome}/usr/bin

# this may not be the right thing to do
# but we need the bin -> usr/bin link
if [ -r ${ftphome}/bin ]; then
   mv -f ${ftphome}/bin ${ftphome}/Obin
fi
ln -s usr/bin ${ftphome}

# Ensure that the /usr/lib and /etc directories exist
if [ ! -d ${ftphome}/usr/lib ]; then
   mkdir -p ${ftphome}/usr/lib
fi
if [ ! -d ${ftphome}/etc ]; then
   mkdir -p ${ftphome}/etc
fi

#Most of the following are needed for basic operation, except
#for libnsl.so, nss_nis.so, libsocket.so, and straddr.so which are
#needed to resolve NIS names.

cp /usr/lib/ld.so /usr/lib/ld.so.1 ${ftphome}/usr/lib

for lib in libc libdl libintl libw libnsl libsocket \
    nss_nis nss_nisplus nss_dns nss_files
do
    cp /usr/lib/${lib}.so.1 ${ftphome}/usr/lib
    rm -f ${ftphome}/usr/lib/${lib}.so
    ln -s ./${lib}.so.1 ${ftphome}/usr/lib/${lib}.so
done

cp /usr/lib/straddr.so.2 ${ftphome}/usr/lib
rm -f ${ftphome}/usr/lib/straddr.so
ln -s ./straddr.so.2 ${ftphome}/usr/lib/straddr.so

cp /etc/passwd /etc/group /etc/netconfig ${ftphome}/etc

chmod 555 ${ftphome}/usr/lib/*
chmod 444 ${ftphome}/etc/*

# Now set the ownership and modes
chown root ${ftphome}/usr/lib ${ftphome}/etc
chmod 555 ${ftphome}/usr/lib ${ftphome}/etc

# Ensure that the /dev directory exists
if [ ! -d ${ftphome}/dev ]; then
   mkdir -p ${ftphome}/dev
fi

# make device nodes. ticotsord and udp are necessary for
# 'ls' to resolve NIS names.
prefix="/devices/pseudo/mm@0:"

for device in zero
do
    line=`ls -l ${prefix}${device} | sed -e 's/,//'`
    major=`echo $line | awk '{print $5}'`
    minor=`echo $line | awk '{print $6}'`
    rm -f ${ftphome}/dev/${device}
    mknod ${ftphome}/dev/${device} c ${major} ${minor}
done

prefix="/devices/pseudo/clone@0:"

for device in tcp udp ticotsord
do
    line=`ls -l ${prefix}${device} | sed -e 's/,//'`
    major=`echo $line | awk '{print $5}'`
    minor=`echo $line | awk '{print $6}'`
    rm -f ${ftphome}/dev/${device}
    mknod ${ftphome}/dev/${device} c ${major} ${minor}
done
chmod 666 ${ftphome}/dev/*

## Now set the ownership and modes
chown root ${ftphome}/dev
chmod 555 ${ftphome}/dev

if [ ! -d ${ftphome}/pub ]; then
   mkdir -p ${ftphome}/pub
fi
chown ftp ${ftphome}/pub
chmod 777 ${ftphome}/pub

----------------------------------------------------------------------
20. eval 和 exec 的不同
    eval 只是去執行後面的命令,但是 exec 會執行該命令後跳出 shell
    看例子就知道

#!/bin/sh
echo "Input command : \n"
read cmd
eval $cmd
# 底下會執行
echo "You can see this line ..after executing $cmd"


#!/bin/sh
echo "Input command : \n"
read cmd
exec $cmd
# 底下不會執行
echo "You can not see this line ..after executing $cmd"

----------------------------------------------------------------------
21. 字串連接, 如下,最後會印出 /etc/yp

yproot_dir=/etc
def_dom=yp
domain_dir="$yproot_dir""/""$def_dom"
echo $domain_dir

----------------------------------------------------------------------
22. case , if , function 綜合用法

#!/bin/sh

killproc() {            # kill the named process(es)
pid=`ps -e | grep $1 | sed -e 's/^  *//' -e 's/ .*//'`

# 請特別注意 $pid 和 "$pid" 居然不同,我也不懂

#if [ $pid = "" ]; then
if [ "$pid" = "" ]; then
  echo "Can't find process \"$1\" "; exit 2
fi

echo "kill the process \"$1\" with PID $pid"; kill $pid 2> /dev/null
}

case $# in
  1)
    killproc $1
    ;;
  *)
    echo "usage: $0 daemon-name"
    ;;
esac

----------------------------------------------------------------------
23. 將大寫檔名改成小寫檔名
    tr string1 string2 會將 standard input內所對應到的 string1
    都以 string2 取代

for file in *; do
   mv $file `echo $file | tr '[A-Z]' '[a-z]'`
done


加上一點變化,只處理大寫的檔名,不過執行過後,第二次會有問題,還不是很懂
for file in [A-Z]*; do
   echo "process $file"
   mv $file `echo $file | tr '[A-Z]' '[a-z]'`
done

----------------------------------------------------------------------
24. case 的變化,一個轉換西元到民國的範例
    [0-9][0-9] 表示有兩個存在的數,
    [0-9][0-9][0-9][0-9] 表示有四個存在的數
    當然也可以 [a-Z] [a-A]等等的變化了
    不懂的地方是 echo 1>&2 這個敘述

echo "Input year : \c"
read year
case "$year" in
  [0-9][0-9])
     year=19${year}
     years=`expr $year - 1911`
     ;;
  [0-9][0-9][0-9][0-9])
     years=`expr $year - 1911`
     ;;
  *)
     echo 1>&2 Year \"$year\" out of range ...
     exit 127
     ;;
esac
echo "$year 是民國 $years"

----------------------------------------------------------------------
25. if 內有兩個判斷式的寫法

echo "Input year : \c"
read year
if [ $year -lt 1901  -o  $year -gt 2099 ]; then
   echo 1>&2 Year \"$year\" out of range
   exit 127
fi

----------------------------------------------------------------------
26. 處理一些多選一的字元

read next
case "$next" in
   *[A-Za-z]*)  echo "a-z A-Z"
                ;;
   *[0-9]*)     echo "0-9"
                ;;
   *)           echo "others.."
esac

----------------------------------------------------------------------
27. 7-Apr, 2003 新增

#!/bin/sh

# absolutly path condition
if [ -z `echo $1 | awk -F / {'print $1'}` ]; then
   if [ -x $1 ]; then
      echo "Yes, $1 is executable"
   fi

# others
else
   for foo in `echo $PATH | sed -e 's/:/ /g'` ; do
     # echo "searching $foo directory"
     if [ -x $foo/$1 ]; then
       echo "--> $foo/$1 is executable"
       exit
     fi
   done
fi

2008年7月18日 星期五

SQL語法

SQL語法

資料來源


初階
查詢:列出住在比較溫暖地區的顧客
SELECT CUSTOMER_NAME,CITY
FROM CUSTOMER_V
WHERE CITY IN (’台南市’,'高雄市’,'屏東市’)


查詢:針對CUSTOMER_V中地址在’台南市’,'高雄市’,'屏東市’中的所有顧客,列出他們的名稱.所在城市.而且顯示的順序是依據城市的字母順序,每個城市內的顧客亦照字母順序排列(預設為升冪)
SELECT CUSTOMER_NAME,CITY
FROM CUSTOMER_V
WHERE CITY IN (’台南市’,'高雄市’,'屏東市’)
ORDER BY CITY , CUSTOMER_NAME

‘排列順序是依據所列出的欄位順序來決定的;若要由高到低排列,則在排序欄位後面加上DESC關鍵字

查詢:計算我們出貨到每一州的顧客數目
SELECT STATE,COUNT(STATE)
FROM CUSTOMER_V
GROUP BY STATE;

查詢:計算我們出貨到每個城市的顧客數目,請依據州來列出這些城市
SELECT STATE,CITY,COUNT(CITY)
FROM CUSTOMER_V
GROUP BY STATE,CITY;

查詢:計算我們出貨到每個州的顧客數目,請依據州來列出這些顧客,並找出有一個顧客以上的州
SELECT STATE,COUNT(STATE)
FROM CUSTOMER_V
GROUP BY STATE
HAVING COUNT(STATE) > 1

查詢:針對平均定價少於$750的外裝產品,列出這些外裝產品的外裝與平均定價.
SELECT PRODUCT_FINISH,AVG(STANDARD_PRICE)
FROM PRODUCT_V
WHERE PRODUCT_FINISH IN (’運動鞋’,'跑步鞋’,'淑女鞋’)
GROUP BY PRODUCT_FINISH
HAVING AVG(STANDARD_PRICE)
‘注意:這六個關鍵字若要同時出現,必須以這種順序呈現….(這是語法順序)

(這是處理順序)
FROM 指定涉及的表格(TABLE)
WHERE 找出符合指定條件的所有列(ROW)
GROUP BY 根據指定欄位的值組織列(ROW)
HAVING 找出符合指定條件的所有群組
SELECT 指定要顯示給使用者看的欄位(COLUMN)
ORDER BY 排列資料列(ROW)的順序

進階
等值合併
查詢:下訂單的所有顧客名稱
SELECT CUSTOMER_T.CUSTOMER_ID,ORDER_T.CUSTOMER_ID,CUSTOMER_NAME,ORDER_ID
FROM CUSTOMER_T,ORDER_T
WHERE CUSTOMER_T.CUSTOMER_ID = ORDER_T.CUSTOMER_ID;

自然合併
查詢:對於每下訂單的顧客名稱,查出他的姓名與訂單號碼為何?
SELECT CUSOTMER_T.ID,CUSTOMER_T.NAME,ORDER_T.ID
FROM CUSTOMER_T,ORDER_T
WHERE CUSTOMER_T.CUSTOMER_ID = ORDER_T.CUSTOMER_ID

外部合併
查詢:為CUSTOMER表格中的所有顧客,列出他們的顧客姓名.識別碼及訂單號碼.即使沒有訂單的顧客,也請列出他們的顧客識別碼與姓名
SELECT CUSTOMER_T.NAME,CUSTOMER_T.CUSTOMER_ID,ORDER_ID
FROM CUSTOMER_T LEFT OUTER JOIN ORDER_T
WHERE CUSTOMER_T.CUSTOMER_ID = ORDER_T.CUSTOMER_ID

查詢:為ORDER表格中的所有訂單,列出他們的顧客姓名.識別碼及訂單號碼.即使沒有顧客姓名,也要加入訂單號碼哦(這個查詢最主要的目的在於確認參考的完整性)
SELECT CUSTOMER_T.NAME,CUSTOMER_T.CUSTOMER_T.CUSTOMER_ID,ORDER_ID
FROM CUSTOMER_T RIGHT OUTER JOIN ORDER_T ON CUSTOMER_T.CUSTOMER_ID = ORDER_T.CUSTOMER_ID;

聯集合併
UNION JOIN = FULL OUTER JOIN
UNION JOIN <> UNION
UNION JOIN 的結果是每個合併

合併兩個表格的兩種方式:

利用合併技巧,在where子句中,加入兩個表格共同的欄位等式
利用子查詢或稱為巢狀查詢
子查詢
當要擷取與顯示來自數個關聯表的資料,並且未必是巢狀關係時,可以使用合併技巧.

查詢:對#1008下訂單的顧客姓名與地址(使用合併技巧)
SELECT CUSTOMER_NAME,CUSTOMER_ADDRESS,CITY,STATE,POSTAL_CODE
FROM CUSTOMER_T,ORDER_T
WHERE CUSTOMER_T.CUSTOMER_ID = ORDER_T.CUSTOMER_ID AND ORDER_T.ORDER_ID = 1008;

查詢:對#1008下訂單的顧客姓名與地址(使用子查詢)
SELECT CUSTOMER_NAME,CUSTOMER_ADDRESS,CITY,STATE,POSTAL_CODE
FROM CUSTOMER_T
WHERE CUSTOMER_T.CUSTOMER_ID = (SELECT ORDER_T.CUSTOMER_ID FROM ORDER_T WHERE ORDER_T.ORDER_ID = 100

注意:若要將子查詢的結果顯示在最終結果中,就得使用合併技巧,因為子查詢資料不能出現在最終的結果中(VIP)

查詢:哪些顧客下過訂單?(使用子查詢-傳回多筆值)
SELECT CUSTOMER_NAME
FROM CUSTOMER_T
WHERE CUSTOMER_T.CUSTOMER_ID IN
( SELECT DISTINCT CUSTOMER_ID FROM ORDER_T)


查詢:哪些顧客未訂購過電腦桌?(使用子查詢-傳回多筆值)
SELECT CUSTOMER_NAME
FROM CUSTOMER_T
WHERE CUSTOMER_ID NOT IN
(SELECT CUSTOMER_ID
FROM ORDER_T,ORDER_LINE_T,PRODUCT_T
WHERE ORDER_T.ORDER_ID = ORDER_LINE_T.ORDER_ID
AND ORDER_LINE_T.PRODUCT_ID = PRODUCT_T.PRODUCT_ID
AND PRODUCT_NAME = ‘COMPUTER DEST’ );


查詢:所有包含天然梣木傢具的訂單編號
SELECT ORDER_ID
FROM ORDER_LINE_T
WHERE EXITS
( SELECT *
FROM PRODUCT_T
WHERE PRODUCT_ID = ORDER_LINE_T.PRODUCT_ID
AND PRODUCT_FINISH = ‘NATURAL ASH’ );

在子查詢中使用EXITS時,它在意的是是否有符合條件的資料即可,
並不會利用子查詢的結果來篩選出母查詢(外層)最終的結果
還有啊,相關聯子查詢的處理順序會是從外到內,而一般的子查詢則是從內到外…有點不一樣

查詢:列出最高單價產品的明細(這是高級技巧)
SELECT PRODUCT_NAME,PRODUCT_FINISH,UNIT_PRICE
FROM PRODUCT_T PA
WHERE UNIT_PRICE > ALL
( SELECT UNIT_PRICE
FROM PRODUCT_T PB
WHERE PB.PRODUCT_ID PA.PRODUCT_ID )


查詢:哪個產品的標準價格高過平均標準價格?
SELECT PRODUCT_DESCRIPTION,STANDARD_PRICE,AVGPRICE
FROM ( SELECT AVG(STANDARD_PRICE) AVGPRICE FROM PRODUCT_T ),PRODUCT_T
WHERE STANDARD_PRICE > AVGPRICE ;

RedHat 9.0竟然沒有 mkfs.jffs2這個指令!!!


RedHat 9.0竟然沒有 mkfs.jffs2這個指令!!!

網路上搜尋了一下~

找到了解決方法!!

下載mkfs.jffs2這個binary檔,然後放入/sbin的資料夾裡,即可使用。

mkfs.jffs2下載點

2008年6月13日 星期五

DHCP Message

DHCP MESSAGE

轉貼來源


DHCP(Dynamic Host Configuration Protocol,動態主機配置協議)是IETF為實現IP的自動配置而設計的協議,它可以為客戶機自動分配IP位址、子網路遮罩以及缺省閘道、DNS伺服器的IP地址等TCP/IP參數。瞭解DHCP工作過程可以説明我們排除有關DHCP服務遇到的問題。DHCP 協議是基於UDP層之上的應用,本文結合抓報所得資料分析DHCP協議實現原理

一、先瞭解一下需要抓取的DHCP報文

客戶發出的IP租用請求報文
  DHCP客戶機初始化TCP/IP,通過UDP埠67向網路中發送一個DHCPDISCOVER廣播包,請求租用IP位址。該 廣播包中的源IP位址為0.0.0.0,目標IP位址為255.255.255.255;包中還包含客戶機的MAC位址和電腦名。

DHCP回應的IP租用提供報文
  任何接收到DHCPDISCOVER廣播包並且能夠提供IP地址的DHCP伺服器,都會通過UDP埠68給客戶機回應一個DHCPOFFER廣播包,提供一個IP位址。該廣播包的源IP地址為DCHP伺服器IP,目標IP位址為255.255.255.255;包中還包含提供的IP位址、子網路遮罩及租期等資訊。

客戶選擇IP租用報文
  客戶機從不止一台DHCP伺服器接收到提供之後,會選擇第一個收到的DHCPOFFER包,並向網路中廣播一個 DHCPREQUEST消息包,表明自己已經接受了一個DHCP伺服器提供的IP地址。該廣播包中包含所接受的IP位址和伺服器的IP地址。 所有其他的DHCP伺服器撤銷它們的提供以便將IP地址提供給下一次IP租用請求。

DHCP伺服器發出IP租用確認報文
  被客戶機選擇的DHCP伺服器在收到DHCPREQUEST廣播後,會廣播返回給客戶機一個DHCPACK消息包,表明已經接受客戶機的選擇,並將這一IP位址的合法租用以及其他的配置資訊都放入該廣播包發給客戶機。
客戶配置成功後發出的公告報文
  客戶機在收到DHCPACK包,會使用該廣播包中的資訊來配置自己的TCP/IP,則租用過程完成,客戶機可以在網路中通信。
至此一個客戶獲取IP的DHCP服務過程基本結束,不過客戶獲取的IP一般是用租期,到期前需要更新租期,這個過程是通過租用更新資料包來完成的。

客戶IP租用更新報文
(1)在當前租期已過去50%時,DHCP客戶機直接向為其提供IP地址的DHCP伺服器發送DHCPREQUEST消息包。如果客戶機接收到該伺服器回應的DHCPACK消息包,客戶機就根據包中所提供的新的租期以及其它已經更新的TCP/IP參數,更新自己的配置,IP租用更新完成。如果沒收到該伺服器的回復,則客戶機繼續使用現有的
IP地址,因為當前租期還有50%。
(2)如果在租期過去50%時未能成功更新,則客戶機將在當前租期過去87.5%時再次向為其提供IP地址的DHCP聯繫。如果聯繫不成功,則重新開始IP租用過程。
(3)如果DHCP客戶機重新啟動時,它將嘗試更新上次關機時擁有的IP租用。如果更新未能成功,客戶機將嘗試聯繫現有IP租用中列出的缺省閘道。如果聯繫成功且租用尚未到期,客戶機則認為自己仍然位於與它獲得現有IP租用時相同的子網上(沒有被移走)繼續使用現有IP位址。 如果未能與缺省閘道聯繫成功,客戶機則認為自己已經被移到不同的子網上,將會開始新一輪的IP租用過程。

  DHCP客戶機在發出IP租用請求的DHCPDISCOVER廣播包後,將花費1秒鐘的時間等待DHCP伺服器的回應,如果1秒鐘沒有伺服器的回應,它會將這一廣播包重新廣播四次(以2,4,8和16秒為間隔,加上1~1000毫秒之間隨機長度的時間)。四次之後,如果仍未能收到伺服器的回應,則運行Windows 2000的DHCP客戶機將從169.254.0.0/16這個自動保留的私有IP位址(APIPA)中選用一個IP位址,而運行其他操作系統的DHCP客戶機將無法獲得IP地址。DHCP客戶機仍然每隔5分鐘重新廣播一次,如果收到某個伺服器的回應,則繼續IP租用過程。


DHCP

DHCP

轉貼來源



11.1 DHCP概述
11.1.1 採用DHCP的必要性
在TCP/IP網路上,每台工作站要能存取網路上的資源之前,都必須進行基本的網路配置,一些主要參數諸如IP位址,子網路遮罩,缺省閘道,DNS等必不可少,還可能需要一些附加的資訊如IP管理策略之類。對於一個稍微大點的網路而言,網路的管理和維護的任務是相當繁重的。一台電腦從一個子網轉移到另一個子網,就要重新對系統進行配置。對於普通水準的工作站使用者是不能賦予他們配置自己的工作站網路的許可權,而且也沒有這個必要。如果一個沒有相應技術水準的用戶出於好奇或想學習一下的目的錯誤地更改了工作站的網路配置,造成網路故障,後果不言而喻。因此,需要有一種機制來讓TCP/IP的配置和管理從使用者端轉移到網路管理端,實現IP的集中式管理。解決方案就是用DHCP。

11.1.2 DHCP的主要功能
DHCP的全稱是動態主機設定通訊協定(Dynamic Host Configuration Protocol),由IETF(Internet 網路工程師任務小組)設計,詳盡的協定內容在RFC文檔rfc2131和rfc1541裡。目的就是為了減輕TCP/IP網路的規劃、管理和維護的負擔,解決IP位址空間缺乏問題。運行DHCP的伺服器把TCP/IP網路設置集中起來,動態處理工作站IP位址的配置,用DHCP租約和預置的IP地址相聯繫,DHCP租約提供了自動在TCP/IP網路上安全地分配和租用IP位址的機制,實現IP位址的集中式管理,基本上不需要網路管理人員的人為干預。而且,DHCP本身被設計成BOOTP(自舉協定)的擴展,支援需要網路配置資訊的無盤工作站,對需要固定IP的系統也提供了相應支援。

11.2 DHCP的工作原理
11.2.1 幾個DHCP名詞
在介紹DHCP工作原理以前,先解釋這幾個名詞的含義:

DHCP客戶:DHCP客戶是一通過DHCP來獲得網路配置參數的Internet主機,通常就是普通使用者的工作站。

DHCP伺服器:DHCP伺服器是提供網路設置參數給DHCP客戶的Internet主機。

DHCP/BOOTP 中繼代理:在DHCP客戶和伺服器之間轉發 DHCP 消息的主機或路由器。

DHCP是基於客戶機/伺服器模型設計的,DHCP客戶和DHCP伺服器之間通過收發DHCP消息進行通訊。

11.2.2 DHCP 消息的格式:
0 1 2 3
0123456789 0123456789 0123456789 0123456789

op (1) htype (1) hlen (1) hops (1)
xid (4)
secs (2) flags (2)
ciaddr (4)
yiaddr (4)
siaddr (4)
giaddr (4)
chaddr (16)
sname (64)
file ( 128)
options ( 312)




DHCP 消息的格式與BOOTP消息大部分相同, 這樣設計可以增強BOOTP伺服器工具,同時為BOOTP和DHCP兩種客戶服務。另外,BOOTP的中繼代理可用來轉發跨子網的DHCP請求。

各段描述如下

括弧裡的數字代表這個段以8位元組為單位的大小,除options外,其餘的段的長度都是固定的,options段的長度至少是312個8位組。

如op(1)代表這個段的長度為一個8位組

op 是消息操作代碼,值為1 代表BOOTREQUEST(自舉請求)值為2 代表BOOTREPLY(自舉回應)

在DHCP客戶和DHCP伺服器對話期間,op段被DHCP客戶設置為BOOTREQUEST(1), 被DHCP伺服器設置為 BOOTREPLY(2)。

htype 是硬體網址類別型

hlen 是硬體位址長度

hops DHCP客戶置這項為零,中繼代理要用

xid DHCP客戶在尋求時產生的一個亂數, 它提供了對所有後續的DHCP消息中的客戶請求和伺服器回應的一

種聯合。

ciaddr 客戶機用來請求一個特定的IP位址, 這個位址以前曾經分配給該客戶機,希望保留。

yiaddr 由DHCP伺服器填寫,包含它提供給某一DHCP客戶的IP位址。

siaddr 伺服器的主機位址

giaddr 中繼代理的IP位址

chaddr DHCP客戶硬體位址

sname 伺服器主機名稱

file 開機檔案名

options 選項


在獲得IP位址前,DHCP客戶用 htype, hlen 和 chaddr 段表明它的硬體位址, 這個值由
向客戶硬體位址作出回應的伺服器和中繼代理利用。 以前BOOTP協議中的兩個沒有用到的8位組
的flags段在DHCP消息裡有了定義。這個段的高位比特用於表明客戶機能不能在IP位址沒有被配置前接
收Unicast 回應, 剩下的低位比特保留且必須置為零。 hops 和 secs 段在初始化過程中被中繼代理
有選擇地利用。 sname 和 file 域可以被BOOTP或無盤站利用。

關於 options 選項

選項附加在DHCP消息的固定長度段之後, 為了與BOOTP工具相容, 選項段的前四個8位組包含了
RFC1497中定義的magic cookies,餘下的段就都是DHCP 選項。在RFC1533裡定義了DHCP的所有的選項
的格式。大多數選項用於標誌網路傳輸設置值, 例如子網路遮罩 (mask)、 DNS 服 務 器 地 址 等其
他選項被DHCP協定利用, 且在大多數消息中是必需的。

DHCP 選項的編碼格式如下:

Code Length value

26 2 m1 m2




選項可以固定長度或可變長度,所有的選項都以一個8位元組標識碼開始,這個標識碼用來標識選項。不帶資料的固定長度選項就只由一個標識碼構成。而且只有選項0和255是固定長度,其它的選項都可變長度的,為了標明選項資料的長度,在標識碼後面是一個長度8位組,這個長度8位組的值不包含標識碼和長度碼本身。

例如,DHCP選項裡的子網路遮罩選項如下定義

Code Length Subnet Mask

1 4 m1 m2 m3 m4



標識碼是1,長度是4個8位組,隨後的4個8位組就是子網路遮罩


DHCP消息類型選項的標識碼是53,長度是1個8位組,值是從1到7,分別代表不同的DHCP消息類型。


Code Length Type

53 1 1-7




值 消息類型
1 DHCPDISCOVER
2 DHCPOFFER
3 DHCPREQUEST
4 DHCPDECLINE
5 DHCPACK
6 DHCPNAK
7 DHCPRELEASE




最後一項選項是零長度的End(選項 255), 表明這是選項的結束以便DHCP客戶處理。 採用選項編碼的好處是不論選項有多長,DHCP客戶都可以正確接收,即使是它不認識的選項(不見得所有的DHCP客戶程式都完全遵循RFC標準)。

不論是DHCP客戶還是DHCP伺服器,都是通過按DHCP消息格式要求來填寫各個段形成具體的DHCP消息,
DHCP用的傳輸協議的非連線導向的UDP(使用者資料包通訊協定),從DHCP客戶發出的DHCP消息送往DHCP服務
器的埠67,DHCP伺服器發給客戶的DHCP消息送往DHCP客戶的埠68,由於在取得伺服器賦予的IP之前,
DHCP客戶並沒有自己的IP,所以包含DHCP消息的UDP資料包的IP頭的源地址段是0.0.0.0,目的地址則是
255.255.255.255。

11.2.3 DHCP分配IP地址的過程:
DHCP客戶機初始化TCP/IP,在本地物理子網上廣播一個 DHCPDISCOVER 消息, 以確定DHCP伺服器位
置及其IP地址。如果DHCP伺服器和客戶不在同一個物理子網上,BOOTP中繼代理將轉發這個消息給DHCP伺服器。由於網路上可能不止一個DHCP伺服器,凡所有具有有效IP位址資訊的DHCP伺服器向客戶機發出一個提議。客戶機從接收到的第一個提議中選定IP位址資訊,並廣播一條租用位址的消息請求。由發出該提議的DHCP伺服器回應該消息,指定IP位址資訊給該客戶機並發送一個確認,而所有其它DHCP伺服器撤回各自的提議。客戶機完成TCP/IP協議的初始化和綁定。配置完成後,客戶機就可以使用普通網路通信和連接至其它IP主機時用到的所有IP服務和應用。

11.4 基本應用

從目前情況看,大多數Linux DHCP伺服器是為Windows95/98客戶平臺提供服務。

11.4.1 增加主機路由

為了使DHCP伺服器能為正確MS的DHCP客戶機器服務,需要創建一個到位址255.255.255.255
的路由,把這條路由命令加到/etc/rc.d/rc.local,使得每次機器啟動後自動運行。

#route add -host 255.255.255.255 dev eth0

在一些老Linux核心的系統裡可能會報告錯誤消息:

255.255.255.255: Unkown host

可以試著加下面的條目到/etc/hosts檔裡

255.255.255.255 dhcphost

再用下麵的命令

#route add -host dhcphost dev eth0

11.4.2 修改設定檔
DHCPd默認的設定檔是/etc/dhcpd.conf,這是一個文字檔,DHCPd裡有一個語法分析器,能對這個檔進行語法分析,獲得配置參數。dhcpd.conf 格式是遞迴下降的,關鍵字大小寫敏感,可以有注釋,注釋以#開頭,一直到該行結束。這裡給出一個簡單的dhcpd.conf的例子,所服務的網路為C類保留網路 192.168.1.0

#examples

# 缺省租約時間

default-lease-time 28800;

# 最大租約時間

max-lease-time 43200;

# 子網路遮罩選項

option subnet-mask 255.255.255.0;

# 廣播地址

option broadcast-address 192.168.1.255;

# 路由器地址

option routers 192.168.1.1;

# DNS地址

option domain-name-servers 192.168.1.1;

# 功能變數名稱

option domain-name \"netreslab.org\";

# 以上都是全域參數

# 子網聲明和遮罩

subnet 192.168.1.0 netmask 255.255.255.0 {

# 範圍
range 192.168.1.10 192.168.1.100;

# 範圍

range 192.168.1.150 192.168.1.200;

}

這段設定檔將允許DHCP伺服器分配兩段位址範圍給DHCP客戶,192.168.1.10-100 和192.168.1.150-200
如果DHCP客戶在申請租約時不請求一個特定租約失效時間,則以default-lease-time(28800秒)為租約時間,如果有請求一個特定的租約失效時間,則採用max-lease-time(432000秒)

伺服器發送下麵的參數給DHCP客戶機:

子網路遮罩是255.255.255.0 ,廣播地址是192.168.1.255,預設閘道器是192.168.1.1,DNS是192.168.1.1。

如果要為一台叫做hotdog的機器指定固定的IP位址,可以在dhcpd.conf文件加一條

host hotdog {

# hotdog上網卡的硬體位址
hardware ethernet 08:00:00:4c:58:23;
#固定IP
fixed-address 192.168.1.210;
}

11.4.3 dhcpd.leases

dhcpd.leases 是DHCP客戶租約的資料庫檔,預設目錄在/var/state/dhcp/,檔包含租約聲明,每次一個租約被獲取、更新或釋放,它的新值就被記錄到檔的的末尾。在DHCPd第一次安裝後,並不會生成這個檔。但DHCPd的運行需要這個檔,所以可以建立一個空的檔。

# touch /var/state/dhcp/dhcpd.leases

DHCPd記錄這個檔的格式是

lease ip-address { statements... }

每個記錄包含一個提供給客戶的IP位址,在花括弧裡的語句包含一些租約資訊。具體的租約資訊因客戶發出不同的DHCP請求而稍有差別。


11.4.4 運行DHCPd

要啟動DHCPd, 簡單地鍵入 /usr/sbin/dhcpd 或用ntsysv 把DHCPd服務自動啟動,也可以用

/etc/rc.d/init.d/dhcpd start,

這樣啟動後,DHCPd是啟動在eth0 上,如果DHCPd上的伺服器還有另外一塊網卡eth1, 想在eth1上啟動

dhcpd,就鍵入

#/usr/sbin/dhcpd eth1

以上述例子的dhcpd.conf來啟動dhcpd,如果我們啟動一Windows95機器,Windows95的網路配置的TCP/IP選項裡指定自動獲得IP位址,也就是啟用Windows95裡的DHCP客戶程式,這台95機器的主機名稱叫ONE,進入系統後,用winipcfg查看,如下圖:




在Windows95機器獲得租約後,DHCPd會在dhcp.leases裡建一條記錄

lease 192.168.1.154 {

starts 1 2000/05/15 13:36:42;
ends 1 2000/05/15 21:36:42;
hardware ethernet 00:00:21:4e:3f:58;
uid 01:00:00:21:4e:3f:58;
client-hostname \"one\";

}

要注意的是dhcpd.leases的時間記錄採用GMT時間,而不是本地時區的時間。 要查看本機的GMT時間可以用

date -u


11.5 進一步說明dhcpd.conf
11.5.1 dhcpd.conf 概述

前面說過,dhcpd.conf是個遞迴下降格式的設定檔,有點象C的來源程式風格,由參數和聲明兩大類語句構

成,參數類語句主要告訴DHCPd網路參數, 如租約的時間、閘道、DNS等,而聲明語句則是描述網路的拓撲,

用來表明網路上的客戶、要提供給客戶的IP位址、提供一個參數組給一組聲明等。

描述網路拓撲的聲明語句有 shared-network 和 subnet 聲明。.如果要給一個子網裡的客戶動態指定IP地

址,那麼在subnet聲明裡必須有一個 range 聲明,說明位址範圍。如果要給DHCP客戶靜態指定IP位址,那麼

每個這樣客戶都要有一個host 聲明。 對於每個要提供服務的與DHCP伺服器連接的子網,都要有一個 subnet

聲明,即使這是個沒有IP位址要動態分配的子網。

一個典型的dhcpd.conf如下

#example
#全域參數

shared-network 共用網路名 {

共用網路特定參數...

subnet 204.254.239.0 netmask 255.255.255.224 {

子網特定參數...

range 204.254.239.10 204.254.239.30;
}
subnet 204.254.239.32 netmask 255.255.255.224 {

子網特定參數...
range 204.254.239.42 204.254.239.62;
}
}

subnet 204.254.239.64 netmask 255.255.255.224 {

子網特定參數...

range 204.254.239.74 204.254.239.94;
}

group {

組特定參數...

host ws1.domain {
特定主機參數...
}
host ws2.domain {
特定主機參數...
}
host ws3.domain {
特定主機參數...
}
}





11.5.2 語句參考


因為DHCPd的語句很多,不可能一一列出,這裡給出最常用和最重要的語句。


11.5.1.1 聲明類語句


share-network 語句

shared-network name {

[ 參數 ]

[ 聲明 ]
}

share-network 用於告訴DHCP伺服器某些IP子網其實是共用同一個物理網路。任何一個在共用物理網路裡的

子網都必須聲明在 share-network 語句裡。當屬於其子網裡的客戶啟動時,將獲得在share-network語句裡

指定參數,除非這些參數被subnet 或 host 裡的參數覆蓋。用share-network是一種權宜之計,例如某公司

用B類網路145.252,公司裡的部門 A 被劃在子網 145.252.1.0 裡, 子網路遮罩為255.255.255.0,這裡子網

號為8個bit,主機號也為8個bit,但如果部門 A 急速增長,超過了254個節點,而物理網路還來不及增加,

就要在原來這個物理網路上跑兩個8bit遮罩的子網,而這兩個子網其實是在同一個物理網路上,

share-network 語句可以如下


shared-network share1 {

subnet 145.252.1.0 netmask 255.255.255.0 {
range 145.252.1.10 145.252.1.253;
}

subnet 145.252.2.0 netmask 255.255.255.0 {
range 145.252.2.10 145.252.1.253;
}


這裡的share1是個共用網路名。

subnet 語句:

subnet subnet-number netmask netmask {

[ 參數 ]

[ 聲明 ]
}

subnet 語句用於提供足夠的資訊來闡明一個IP位址是否屬於該子網。也可以提供指定的子網參數和指明那些

屬於該子網的IP位址可以動態分配給客戶,這些IP位址必須在 range 聲明裡指定。subnet-number 可以是個IP位址或

能被解析到這個子網的子網號的功能變數名稱。netmask 可以是個IP位址或能被解析到這個子網的遮罩的功能變數名稱。


range 語句:


range [ dynamic-bootp ] low-address [ high-address];

對於任何一個有動態分配IP位址的subnet語句裡,至少要有一個 range 語句,用來指明要分配的IP位址的範

圍。如果只指定一個要分配的IP位址,高位址部分可以省略。


host 語句:

host hostname {
[ 參數 ]

[ 聲明 ]
}

host語句的作用是為特定的客戶機提供網路資訊。



group 語句

group {
[ 參數 ]

[ 聲明 ]
}

組語句給一組聲明提供參數。


allow 和 deny 語句


allow和deny語句用來控制DHCPd對客戶的請求。

unknown-clients 關鍵字

allow unknown-clients;
deny unknown-clients;

allow unknown-clients 允許DHCPd可以動態分配IP給未知的客戶,而 deny unknown-clients 則不允許。

缺省是允許的。

bootp 關鍵字

allow bootp;
deny bootp;

指明DHCPd是否回應bootp查詢,默認是允許的。


11.5.1.2 參數類語句:

default-lease-time 語句

語法

default-lease-time time;


指定缺省租約時間,這裡的time是以秒為單位的。如果DHCP客戶在請求一個租約但沒有指定租約的失效時間,租約時間就是缺省租約時間。


max-lease-time 語句

語法

max-lease-time time;


最大的租約時間。如果DHCP在請求租約時間時有發出特定的租約失效時間的請求,則用最大租約時間。

hardware 語句

語法

hardware hardware-type hardware-address;

指明物理硬體介面類別型和硬體位址。硬體位址由6個8位組構成,每個8位組以“:”隔開。如00:00:E8:1B:54:97

例如:hard

server-name 語句

server-name \"name\";


用於告訴客戶伺服器的名字。


fixed-address 語句


fixed-address address [, address ... ];

fixed-address 語句用於指定一個或多個IP位址給一個DHCP客戶。只能出現在host聲明裡。



11.5.1.3 選項類語句

選項類語句以option 開頭,後面跟一個選項名,選項名後是選項資料,選項非常的多,這裡列出一些常用的

選項供參考

option routers ip-address[, ip-address];

指明在客戶子網內的路由器的位址,可以有多個;

option time-servers ip-address[, ip-address...];

指明時間伺服器的地址。

option domain-name-servers ip-address[, ip-address...];

指明DNS的地址

option host-anme string;

給客戶指定主機名稱,string是個字串。

option domain-name string;

指明功能變數名稱

option interface-mtu mtu;

指明網路介面的MTU,這裡mtu是個正整數

例 option interface-mtu 1500;

option broadcast-address ip-address;

指定廣播地址

11.6總結

以上就是DHCPd常用配置,實際應用DHCP還要考慮IP分配的一些策略問題,同時要保證網路的健壯性,必須至少要有兩台DHCP伺服器一起工作,如果一台出了故障,另一台可以繼續為DHCP客戶服務。然而目前DHCP協議裡並沒有能讓兩台DHCP伺服器協同工作的機制,不能保證分配的位址的唯一性,所以這兩台DHCP伺服器裡的可分配位址空間必須進行調整,不能有交叉重複的IP位址。

2008年5月21日 星期三

Linux 指令 --- tar

T

ar 指令 [轉貼]

來源網址...我忘了(查證中)

# tar [-cxtzjvfpPN] 檔與目錄 ....
參數:
-c :建立一個壓縮檔的參數指令
-x :解開一個壓縮檔的參數指令!
-t :查看 tarfile 裡面的文件!
-z :是否同時具有 gzip 的屬性?亦即是否需要用 gzip 壓縮?
-j :是否同時具有 bzip2 的屬性?亦即是否需要用 bzip2 壓縮?
-v :壓縮的過程中顯示檔!這個常用,但不建議用在背景執行過程!
-f :使用檔名,請留意,在 f 之後要立即接檔名喔!不要再加參數!
-p :使用原文件的原來屬性(屬性不會依據使用者而變)
-P :可以使用絕對路徑來壓縮!
-N :比後面接的日期(yyyy/mm/dd)還要新的才會被打包進新建的檔中!
--exclude FILE:在壓縮的過程中,不要將 FILE 打包!
範例:
範例一:將整個 /etc 目錄下的檔全部打包成為 /tmp/etc.tar
[root@linux ~]# tar -cvf /tmp/etc.tar /etc <==僅打包,不壓縮!
[root@linux ~]# tar -zcvf /tmp/etc.tar.gz /etc <==打包後,以 gzip 壓縮
[root@linux ~]# tar -jcvf /tmp/etc.tar.bz2 /etc <==打包後,以 bzip2 壓縮
# 特別注意,在參數 f 之後的檔檔名是自己取的,我們習慣上都用 .tar 來作為辨識。
# 如果加 z 參數,則以 .tar.gz 或 .tgz 來代表 gzip 壓縮過的 tar file ~
# 如果加 j 參數,則以 .tar.bz2 來作為附檔名啊~
# 上述指令在執行的時候,會顯示一個警告訊息:
# 『tar: Removing leading `/' from member names』那是關於絕對路徑的特殊設定。
範例二:查閱上述 /tmp/etc.tar.gz 文件內有哪些文件?
[root@linux ~]# tar -ztvf /tmp/etc.tar.gz
# 由於我們使用 gzip 壓縮,所以要查閱該 tar file 內的檔時,
# 就得要加上 z 這個參數了!這很重要的!

範例三:將 /tmp/etc.tar.gz 檔解壓縮在 /usr/local/src 底下
[root@linux ~]# cd /usr/local/src
[root@linux src]# tar -zxvf /tmp/etc.tar.gz
# 在預設的情況下,我們可以將壓縮檔在任何地方解開的!以這個範例來說,
# 我先將工作目錄變換到 /usr/local/src 底下,並且解開 /tmp/etc.tar.gz ,
# 則解開的目錄會在 /usr/local/src/etc 呢!另外,如果您進入 /usr/local/src/etc
# 則會發現,該目錄下的檔案屬性與 /etc/ 可能會有所不同喔!

範例四:在 /tmp 底下,我只想要將 /tmp/etc.tar.gz 內的 etc/passwd 解開而已
[root@linux ~]# cd /tmp
[root@linux tmp]# tar -zxvf /tmp/etc.tar.gz etc/passwd
# 我可以透過 tar -ztvf 來查閱 tarfile 內的檔案名稱,如果單只要一個檔,
# 就可以透過這個方式來下達!注意到! etc.tar.gz 內的根目錄 / 是被拿掉了!

範例五:將 /etc/ 內的所有檔案備份下來,並且保存其許可權!
[root@linux ~]# tar -zxvpf /tmp/etc.tar.gz /etc
# 這個 -p 的屬性是很重要的,尤其是當您要保留原本檔的屬性時!

範例六:在 /home 當中,比 2005/06/01 新的檔才備份
[root@linux ~]# tar -N '2005/06/01' -zcvf home.tar.gz /home

範例七:我要備份 /home, /etc ,但不要 /home/dmtsai
[root@linux ~]# tar --exclude /home/dmtsai -zcvf myfile.tar.gz /home/* /etc

範例八:將 /etc/ 打包後直接解開在 /tmp 底下,而不產生檔!


2008年5月16日 星期五

登錄 VB Script DLL 失敗的解決方法

錄 VB Script DLL 失敗的解決方法

資料來源


Outlook 登錄 VB Script DLL 失敗的解決方法
安裝繁體中文版 Office 2007 後,開啟Outlook,有些人會出現「登錄 VB Script DLL 失敗」的訊息,不能啟動Outlook。
這個問題是由於 Office 2007 的語言問題,去 "開始==>程式集==>Microsoft Office==>Microsoft Office 工具==>Microsoft Office 2007 語言設定"。

2008年5月7日 星期三

SIP Intro --- HOLD event

HOLD event

以下是節錄自RFC3264的一段文字,在說明HOLD的implementation。
稍後會說明...

搜尋此網誌