2008年12月15日 星期一

tftp (server/client) 安裝 (on RedHat 9)

tftp (server/client) 安裝


$rpm -qa|grep tftp测试有没有安装。
一、在Red Hat 9光碟上tftp-0.32-4.i386.rpm和tftp-server-0.32-4.i386.rpm
rpm -ivh tftp-server-0.32-4.i386.rpm
rpm -ivh tftp-0.32-4.i386.rpm
二,编辑/etc/xinet.d/tftp文件,修改
###
## -s 指定chroot
## -c 指定可建立資料
server_args= -s /tftpboot -c
disabled=no
三、創見資料文件夾,重新啟動XINETD
#mkdir /tftpboot
#chmod o+w /tftpboot或者chmod 777 /tftpboot
#/etc/init.d/xinetd restart或者service xinetd restart
測試e.g:
#tftp 172.21.5.113
tftp>get xxxx
tftp>put xxxx
tftp>h
--------------/etc/xinetd.d/tftp------------------
# default: off
# description: The tftp server serves files using the trivial file transfer
# protocol. The tftp protocol is often used to boot diskless
# workstations, download configuration files to network-aware printers,
# and to start the installation process for some operating systems.
service tftp
{
disable = no
socket_type = dgram
protocol = udp
wait = yes
user = root
server = /usr/sbin/in.tftpd
server_args = -s /tftpboot -c
per_source = 11
cps = 100 2
flags = IPv4
}



資料來源

2008年9月28日 星期日

開機流程簡介

開機流程簡介


1、載入 BIOS 的硬體資訊,並取得第一個開機裝置的代號;
2、讀取第一個開機裝置的 MBR 的 boot Loader (亦即是 lilo, grub, spfdisk 等等) 的開機資訊;
3、載入 Kernel 作業系統核心資訊, Kernel 開始解壓縮,並且嘗試驅動所有硬體裝置;
4、Kernel 執行 init 程式並取得 run-level 資訊;
5、init 執行 /etc/rc.d/rc.sysinit 檔案;
6、啟動核心的外掛模組 (/etc/modprobe.conf);
7、init 執行 run-level 的各個批次檔( Scripts );
8、init 執行 /etc/rc.d/rc.local 檔案;
9、執行 /bin/login 程式,並等待使用者登入;
10、登入之後開始以 Shell 控管主機。
在/etc/rc.d/rc3.d內,以S開頭的為開機啟動,以K開頭的為關閉,接著的數位代表執行順序
GRUB vga設定

./configure    檢查系統資訊       ./configure --help | more  説明資訊
make clean 清除之前留下的檔
make 編譯
make install 安裝
rpm -q ----->查詢是否安裝 rpm -ql ------>查詢該套件所有的目錄
rpm -qi ----->查詢套件的說明資料 rpm -qc[d] ----->設定檔與說明檔
rpm -ivh ---->安裝 rpm -V -------->查看套件有否更動過
rpm -e ------>刪除 rpm -Uvh ------->升級安裝
--nodeps ----->強行安裝 --test ----->測試安裝


轉貼來源

基本Linux命令

基本Linux命令

一些常用的基本命令:

uname -a    查看內核版本      
ls -al 顯示所有檔的屬性
pwd 顯示當前路徑
cd - 返回上一次目錄
cd ~ 返回主目錄
date s 設置時間、日期
cal 顯示日曆(cal 2006)
bc 計算器具
man & info 幫助手冊
locale 顯示當前字體(locale -a 所有可用字體 /etc/sysconfig/i18n設置檔)
LANG=en 使用英文字體
sync 將資料同步寫入硬碟
shutdonw -h now & half & poweroff 關機
reboot 重啟
startx 進入圖形介面
/work & ?work 向上、下查找文檔內容
chgrp 改變檔案群組(chgrp testing install.log)
chown 改變所屬人(chown root:root install.log)
chmod 改變屬性(chmod 777 install.log read=4 write=2 execute=1)
cp 複製(cp filename)
rm 刪除檔(rm -rf filename 強制刪除檔)
rmdir 刪除資料夾
mv 移動(mv 123.txt 222.txt 重命名)
mkdir 創建資料夾
touch 創建檔 更新當前時間
cat 由第一行開始顯示(cat |more 分頁)
nl 在內容前加行號
more & less 一面一面翻動
head -n filename 顯示第N行內容
tail -n filename 顯示後N行內容
od 顯示非純文檔
df -h 顯示分區空間
du 顯示目錄或檔的大小
fdisk 分區設置(fdisk -l /dev/hda 顯示硬碟分區狀態)
mkfs 建立各種檔案系統 mkfs -t ext3 /dev/ram15
fsck 檢查和修復LINUX檔案
ln 硬連結 ln -s 軟體連結
whereis 查找命令
locate 查找
find 查找(find / -name "xxx.xxx")
which 查看工具
whoami 顯示當前使用者
gcc -v 查看GCC版本
chattr +i filename 禁止刪除(chattr -i filename 取消禁止)
lsattr 顯示隱藏檔屬性
updatedb 更新資料庫
mke2fs 格式化(mkfs -t ext3)
dd if=/etc/passwd of=/tmp/passwd.bak 備份
mount 列出系統所有的分區
mount -t iso9660 /dev/cdrom /mnt/cdrom 掛載光碟
mount -t vfat /dev/fd0 /mnt/floppy 掛載軟碟
mount -t vfat -o iocharset=utf8,umask=000 /dev/hda2 /mnt/hda2 掛載fat32分區
mount -t ntfs -o nls=utf8,umask=000 /dev/hda3 /mnt/hda3 掛載ntfs分區
Linux-NTFS Project: http://linux-ntfs.sourceforge.net/
umount /mnt/hda3 缷載
ifconfig 顯示或設置網路設備
service network restart 重啟網卡
ifdown eth0 關閉網卡
ifup eth0 開啟網卡
clear 清屏
history 歷史記錄(!55 執行第55個指令)
stty 設置終端(stty -a)
fdisk /mbr 刪除GRUB
at 僅進行一次的工作排程
crontab 循環執行的例行性命令([e]編輯,[l]顯示,[r]刪除任務)
& 後臺運行程式(tar -zxvf 123.tar.gz & --------->後臺運行)
jobs 觀看後臺暫停的程式(jobs -l)
fg 將幕後程式調到前臺(fg n ------>n是數位,可以指定進行那個程式)
bg 讓工作在後臺運行
kill 結束進程(kill -9 PID [9]強制結束,[15]正常結束,[l]列出可用的kill信號)
ps aux 查看幕後程式
top 查看幕後程式(top -d 2 每兩秒更新一次 top -d 2 -p10604 觀看某個PID
top -b -n 2 > /tmp/top.txt ----->將 top 的資訊進行 2 次,然後將結果輸出到 /tmp/top.txt)
pstree 以樹狀圖顯示程式([A]以 ASCII 來連接, 列出PID, [p]列出帳號)
killall 要刪除某個服務(killall -9 httpd)
free 顯示記憶體狀態(free -m -------->以M為單位顯示)
uptime 顯示目前系統開機時間
netstat 顯示網路狀態(netstat -tulnp------>找出目前系統上已在監聽的網路連線及其 PID)
dmesg 顯示開機資訊(demsg | more)
nice 設置優先權(nice -n -5 vi & ----->用 root 給一個 nice 植為 -5 ,用於執行 vi)
renice 調整已存在優先權
runlevel 顯示目前的runlevel
depmod 分析可載入模組的相依性
lsmod 顯示已載入系統的模組
modinfo 顯示kernel模組的資訊
insmod 載入模組
modprobe 自動處理可載入模組
rmmod 刪除模組
chkconfig 檢查,設置系統的各種服務(chkconfig --list ----->列出各項服務狀態)
ntsysv 設置系統的各種服務
cpio 備份檔案



壓縮命令:
x.Z      compress 程式壓縮的檔案;
x.bz2 bzip2 程式壓縮的檔案;
x.gz gzip 程式壓縮的檔案;
x.tar tar 程式打包的資料,並沒有壓縮過;
x.tar.gz tar 程式打包的檔案,其中並且經過 gzip 的壓縮


compress filename  壓縮檔  加[-d]解壓  uncompress
gzip filename 壓縮 加[-d]解壓 zcat 123.gz 查看壓縮檔內容
bzip2 -z filename 壓縮 加[-d]解壓 bzcat filename.bz2 查看壓縮檔內容

tar -cvf /home/123.tar /etc 打包,不壓縮
tar -xvf 123.tar 解開包
tar -zxvf /home/123.tar.gz 以gzip解壓
tar -jxvf /home/123.tar.bz2 以bzip2解壓
tar -ztvf /tmp/etc.tar.gz 查看tar內容
cpio -covB > [file|device] 份份
cpio -icduv < [file|device] 還原


vi一般用法


一般模式 編輯模式 指令模式
h左 a,i,r,o,A,I,R,O :w 保存
j下 進入編輯模式 :w! 強制保存
k上 dd 刪除游標當前行 :q! 不保存離開
l 右 ndd 刪除n行 :wq! 保存後離開
0 移動到行首 yy 複製當前行 :e! 還原原始檔
$ 移動到行尾 nyy 複製n行 :w filename 另存為
H 螢幕最上 p,P 粘貼 :set nu 設置行號
M 螢幕中央 u 撤銷 :set nonu 取消行號
L 螢幕最下 [ctrl]+r 重做上一個動作 ZZ 保存離開
G 檔案最後一行 [ctrl]+z 暫停退出 :set nohlsearch 永久地關閉高亮顯示
/work 向下搜索 :sp 同時打開兩個文檔
?work 向上搜索 [ctrl]+w 兩個文檔設換
gg 移動到檔案第一行 :nohlsearch 暫時關閉高亮顯示


Linux目錄架構

Linux目錄架構


linux目錄架構
/ 根目錄
/bin 常用的命令 binary file 的目錄
/boot 存放系統啟動時必須讀取的檔案,包括核心 (kernel) 在內
/boot/grub/menu.lst GRUB設置
/boot/vmlinuz 內核
/boot/initrd 核心解壓縮所需 RAM Disk
/dev 系統周邊設備
/etc 系統相關設定檔
/etc/DIR_COLORS 設定顏色
/etc/HOSTNAME 設定用戶的節點名
/etc/NETWORKING 只有YES標明網路存在
/etc/host.conf 檔說明使用者的系統如何查詢節點名
/etc/hosts 設定用戶自已的IP與名字的對應表
/etc/hosts.allow 設置允許使用inetd的機器使用
/etc/hosts.deny 設置不允許使用inetd的機器使用
/etc/hosts.equiv 設置遠端機不用密碼
/etc/inetd.conf 設定系統網路守護進程inetd的配置
/etc/gateways 設定路由器
/etc/protocols 設定系統支援的協定
/etc/named.boot 設定本機為名字伺服器的設定檔
/etc/sysconfig/network-scripts/ifcfg-eth0 設置IP
/etc/resolv.conf 設置DNS
/etc/X11 X Window的設定檔,xorg.conf 或 XF86Config 這兩個 X Server 的設定檔
/etc/fstab 記錄開機要mount的檔案系統
/etc/inittab 設定系統啟動時init進程將把系統設置成什麼樣的runlevel
/etc/issue 記錄使用者登錄前顯示的資訊
/etc/group 設定使用者的組名與相關資訊
/etc/passwd 帳號信息
/etc/shadow 密碼資訊
/etc/sudoers 可以sudo命令的設定檔
/etc/securetty 設定哪些終端可以讓root登錄
/etc/login.defs 所有使用者登錄時的缺省配置
/etc/exports 設定NFS系統用的
/etc/init.d/ 所有服務的預設啟動 script 都是放在這裡的,例如要啟動或者關閉
/etc/xinetd.d/ 這就是所謂的 super daemon 管理的各項服務的設定檔目錄
/etc/modprobe.conf 內核模組額外參數設定
/etc/syslog.conf 日誌設置檔
/home 使用者家目錄
/lib 系統會使用到的函式程式庫
/lib/modules kernel 的相關模組
/var/lib/rpm rpm套件安裝處
/lost+found 系統不正常產生錯誤時,會將一些遺失的片段放置於此目錄下
/mnt 外設的掛載點
/media 與/mnt類似
/opt 主機額外安裝的軟體
/proc 虛擬目錄,是記憶體的映射
/proc/version 內核版本
/proc/sys/kernel 系統內核功能
/root 系統管理員的家目錄
/sbin 系統管理員才能執行的指令
/srv 一些服務啟動之後,這些服務所需要取用的資料目錄
/tmp 一般使用者或者是正在執行的程式暫時放置檔案的地方
/usr 最大的目錄,存許應用程式和檔
/usr/X11R6: X-Window目錄
/usr/src: Linux原始程式碼
/usr/include:系統標頭檔
/usr/openwin 存放SUN的OpenWin
/usr/man 線上使用手冊
/usr/bin 使用者可執行的 binary file 的目錄
/usr/local/bin 使用者可執行的 binary file 的目錄
/usr/lib 系統會使用到的函式程式庫
/usr/local/lib 系統會使用到的函式程式庫
/usr/sbin 系統管理員才能執行的指令
/usr/local/sbin 系統管理員才能執行的指令
/var 日誌檔
/var/log/secure 記錄登入系統存取資料的檔案,例如 pop3, ssh, telnet, ftp 等都會記錄在此檔案中
/var/log/wtmp 記錄登入者的訊息資料, last
/var/log/messages 幾乎系統發生的錯誤訊息
/var/log/boot.log 記錄開機或者是一些服務啟動的時候,所顯示的啟動或關閉訊息
/var/log/maillog 紀錄郵件存取或往來( sendmail 與 pop3 )的使用者記錄
/var/log/cron 記錄 crontab 這個例行性服務的內容
/var/log/httpd, /var/log/news, /var/log/mysqld.log, /var/log/samba, /var/log/procmail.log:
分別是幾個不同的網路服務的記錄檔


2008年9月27日 星期六

inittab 詳解

inittab 詳解


linux下的/etc/inittab中的英文解釋:
This file describes how the INIT process should set up the system in a certain run-level.The inittab file describes which processes are started at bootup and during normal operation.
通俗的說就是控制linux啟動時的一些程式及級別。

run-level的英文解釋:
# Default runlevel. The runlevels used by RHS are:
# 0 - halt (Do NOT set initdefault to this)
# 1 - Single user mode
# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
# 3 - Full multiuser mode
# 4 - unused
# 5 - X11
# 6 - reboot (Do NOT set initdefault to this)

將上面翻譯過來就是:
# 0 - 停機(千萬不能把initdefault 設置為0 )
# 1 - 單使用者模式
# 2 - 多使用者,沒有 NFS (沒有網路)
# 3 - 完全多使用者模式(標準的運行級,實際上就是text模式)
# 4 - 沒有用到
# 5 - X11 (xwindow)
# 6 - 重新啟動


在inittab檔裡所有的有效語句都遵守如下格式:
id:runlevels:action:process

id: 是標識名,可以任意起名,4個字元以內,要注意的是標識名不能重複,它是唯一的。

runlevels: 表示這一行適用於運行那些級別(如上所示的6個級別);另外sysinit、boot、bootwait這三個進程會忽略這個設置值。此項可以多選,比如要運行1,2,3個級別,就寫成123

action: 表示進入對應的runlevels時,init應該運行process欄位的命令的方式,常用的欄位值及解釋在附錄內。
respawn:表示init應該監視這個進程,即使其結束後也應該被重新啟動。
wait: init應該運行這個進程一次,並等待其結束後再進行下一步操作。
once: init需要運行這個進程一次。
boot: 隨系統啟動運行,所以runlevel值對其無效。
bootwait: 隨系統啟動運行,並且init應該等待其結束。
off: 沒有任何意義。
initdefault: 系統啟動後的預設運行級別;由於進入相應的運行級別會啟動對應級別的進程,所以對其指定process欄位沒有任何意義。如果inittab檔內不存在這一條記錄,系統啟動時在控制台上詢問進入的運行級。
sysinit: 系統啟動時準備運行的命令。比如說,這個命令將清除/tmp.可以查看/etc/rc.d/rc.sysinit腳本瞭解其運行了那些操作。
powerwait: 允許init在電源被切斷時,關閉系統。當然前提是有U P S和監視U P S並通知init電源已被切斷的軟體。RH linux預設沒有列出該選項。
powerfail: 同powerwait,但init不會等待正在運行的進程結束。RH linux預設沒有列出該選項。
powerokwait: 當電源監視軟體報告“電源恢復”時,init要執行的操作。
powerfailnow: 檢測到ups電源即將耗盡時,init要執行的操作,和powerwait/powerfail不同的喲。
ctrlaltdel: 允許init在使用者於控制台鍵盤上按下C t r l + A l t + D e l複合鍵時,重新開機系統。注意,如果該系統放在一個公共場所,系統管理員可將C t r l + A l t + D e l複合鍵配置為別的行為,比如忽略等。我是設置成列印一句罵人的話了^o^. kbrequest:監視到特定的鍵盤複合鍵被按下時採取的動作,現在還不完善。
ondemand:A process marked with an ondemand runlevel will be executed whenever the specified ondemand runlevel is called. However, no runlevel change will occur (ondemand runlevels are ‘a’, ‘b’,and ‘c’)


process:就是執行的程式

舉例:
id:3:initdefault: #表示啟動後進入命令列模式
x:5:once:/etc/X11/prefdm -nodaemon #表示啟動後在xwindow模式下執行一次prefdm -nodaemon


轉貼來源

Linux 單人模式

Linux 單人模式


Linux 主機管理者經常需要進入單人模式, 以進行修復救援的工作(如: 忘了root密碼,再重新設定root新密碼; 不正常關機, 進行檔案修復: fsck -y /dev/sda??). 許 多人對如何進入單人模式, 常常弄不清楚, 本文簡單列出方法, 供各位備查

1. 若是使用 lilo 開機者, 以下方法選一皆可:

請在開機出現 boot: 時, 鍵入:
linux -s
linux 1
linux single
若出現: 沒有這個 kernel 的訊息, 表示核心名稱並不是叫 linux, 此時, 請按 TAB 鍵, 即可列出 kernel 名稱(比如 linux-new). 然後再重覆上述步驟即可.

2. 若是使用 GRUB 者:
開機時, 按 e , 表示準備修改 kernel 開機命令
選擇 kernel 那一列命令, 按 e, 在其後, 空一格, 加上 single, 按 enter.

如下所示:

kernel /vmlinuz-2.4.18-3 ro root=/dev/hda5 kernel single
按 b 開機, 即可順利進入單人模式.
俟出現 # 之後, 即可用 root 身份來維護主機, 工作完成後, 下 exit 可進入正常開機模式

轉貼來源

開啟Linux 的FrameBuffer

開啟Linux 的FrameBuffer


如果使用Grub,修改設定檔 /etc/grub.conf

如原先的內容如

title Red Hat Linux (2.4.20-
root(hd0,0)
kernel /vmlinuz-2.4.20-8 ro root=LABEL=/1 hdc=ide-scsi
initrd /initrd-2.4.20-8.img


修改後
title Red Hat Linux (2.4.20- FrameBuffer
root(hd0,0)
kernel /vmlinuz-2.4.20-8 ro root=LABEL=/1 hdc=ide-scsi vga=0x301
initrd /initrd-2.4.20-8.img
title Red Hat Linux (2.4.20-
root(hd0,0)
kernel /vmlinuz-2.4.20-8 ro root=LABEL=/1 hdc=ide-scsi
initrd /initrd-2.4.20-8.img


# Normal VGA console
# vga = normal
# VESA framebuffer console @ 1024x768x64k
# vga=791
# VESA framebuffer console @ 1024x768x32k
# vga=790
# VESA framebuffer console @ 1024x768x256
# vga=773
# VESA framebuffer console @ 800x600x64k
# vga=788
# VESA framebuffer console @ 800x600x32k
# vga=787
# VESA framebuffer console @ 800x600x256
# vga=771
# VESA framebuffer console @ 640x480x64k
# vga=785
# VESA framebuffer console @ 640x480x32k
# vga=784
# VESA framebuffer console @ 640x480x256
# vga=769



轉貼來源

2008年8月22日 星期五

Linux命令模式解析度

Linux命令模式解析度



Linux命令模式解析度

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
| 640x480 800x600 1024x768 1280x1024
----+-------------------------------------
256 | 0x301 0x303 0x305 0x307
32k | 0x310 0x313 0x316 0x319
64k | 0x311 0x314 0x317 0x31A
16M | 0x312 0x315 0x318 0x31B

彩度\解析度| 640x480 800x600 1024x768 1280x1024 bit
----------+-----------------------------------------
256 | 769 771 773 775 8 bit
32768 | 784 787 790 793 15 bit
65536 | 785 788 791 794 16 bit
16.8M | 786 789 792 795 32 bit

螢幕解析度(X) | 320 640 640 800 800 896 1024 1024 1152 1552 1280 1440 1600
螢幕解析度(Y) | 200 400 480 500 600 672 640 768 720 864 1024 900 1200
---------------+-----------------------------------------------------------------
4 bits | 770 772 774
8 bits | 768 769 879 771 815 874 773 869 353 775 864 796
15 bits | 781 801 784 880 787 816 875 790 870 354 793 865 797
16 bits (5:6:5)| 782 802 785 881 788 817 876 791 871 355 794 866 798
24 bits (8:8:8)| 783 803 786 882 789 818 877 792 872 795 867 799
32 bits (8:8:8)| 804 809 883 814 819 878 824 873 356 829 868 834

一般而言,Debian GNU/Linux 開完機後的螢幕解析度為 640x480。但現在的螢幕尺寸越做越大,若在 Console 下還是使用著 640x480 的解析度似乎並不合宜。
我們可以藉由啟用 FrameBuffer 來改變 Console 的解析度。主要的方法有二:在開機時啟用 vesafb,或在開完機後載入符合您的顯示卡的專用 framebuffer 模組。
vesafb

若要啟用 vesafb,請在開機時傳遞 vga 參數給 Kernel,這個 vga 參數將會同時指定 Console 的解析度。以 GRUB 為例,請修改 /boot/grub/menu.lst 如下:

要求 Linux 在開機時載入 vesafb 以啟用 FrameBuffer,並將螢幕解析度設定為 800x600x24bit

注意, 較舊版的 lilo 沒有支援 16 進制的 0x317 的數值, 請改用 10 進制 791


有時候有些事情一定要在純終端機下工作,
但是有一些Distribution預設沒有開啟純終端機高解析度的功能,
所以螢幕上能顯示的資訊很少,常常輸入一個ls,輸出訊息就超過螢幕的範圍。
往往要用more或Shift+Page Up/Down來看,不過還是有點不方便。
以下就是如何啟動純終端機高解析度的方法。
首先假設你已經會編譯一個可以正常啟動的核心。

以下這個指令是把Linux核心的原始碼解壓縮到/usr/src。
# tar jxvf linux-x.x.x.tar.bz2 -C /usr/src
make menuconfig的時候請把以下兩個功能編進核心裡。
-> Device Drivers
-> Graphics support
[*]VESA VGA graphics support
->Console display driver support
<*> Framebuffer Console support



再來make、安裝好新核心請參考以下表格,選擇一個你想要的解析度與色彩深度。
資料來源:/usr/src/linux-x.x.x/Documentation/fb/vesafb.txt

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


比如說1024x768 64k的代碼是0x317。
然候把『vga=0x317』寫到/boot/grub/menu.lst中,例如:
title Debian GNU/Linux
root (hd0,5)
kernel /boot/vmlinuz-2.6.16.20 root=/dev/hdc6 vga=0x317
initrd /boot/initrd.img-2.6.16.20
savedefault
boot



重新開機,用新的核心啟動試試看。
如果開機候純終端機顯示還是低的解析度(也就是說失敗了),
請把解析度與色彩深度的規格調低一點再試試看。
例如:1024x768 16M(vga=0x318)失敗了,改用1024x768 64k(vga=0x317)看看。

文章出處

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。
稍後會說明...

2008年4月15日 星期二

GVIM --- 指令

GVIM

[u]
動作還原
若不小心下錯指令,可以利用這個指令還原。
[K]
函式查詢
若您在 VIM 中撰寫 C/C++ 程式,可以在 C/C++ 標準函式厙提供的函式名字上按「K」,便可以呼叫出 man page 查詢該函式的用法
[=]
自動程式縮排對齊
若您在 VIM 中撰寫 C/C++ 程式,可以利用「gg」指令將游標移到視窗最上方、利用「v」切換到選取模式、再用「G」將游標移到檔案尾端 (即達到全選的功能),最後按「=」,VIM 便會幫你的程式做自動對齊
[ctrl]+[r]
動作重做
若不小心還原錯了,可以利用這個指令重做。

dd
將該行文字刪除
此項指令可與指令 p (貼上)配合使用
而變成是「剪下」的功能
dw
刪除該單字
cc
將該行文字改變
當輸入此指令時,游標所在該行會被刪除,並自動進入「輸入模式」
cw
改變該單字
當輸入此指令時,該單字在游標之後的字元會被刪除,並自動進入「輸入模式」

yy
將該行文字複製
指令 Y 有相同的功能
[p]
將所剪下或複製的文字貼上

[/]字串
向下搜尋字串
下達此命令之後,若文件中包含該「字串」,則文件中所有「字串」的背景顏色會被置換成較鮮明的顏色,在下達完搜尋指令之後,還可以透過「n」「N」指令作進一步控制。
[n] 跳到下一個「字串」所在地
[N] 跳到上一個「字串」所在地
另外,把游標停在想要搜尋的字串上,按下「*」也可以達到向下搜尋的效果。


[k]
向上移動游標一個字元
也就是方向鍵的「↑」
[j]
向下移動游標一個字元
也就是方向鍵的「↓」
[h]向左移動游標一個字元
也就是方向鍵的「←」
[l]向右移動游標一個字元
也就是方向鍵的「→」

若想跳出輸入模式,則鍵入即可回到命令模式。
[i]在游標左方進入輸入模式
[I]
在游標所在行的行首進入輸入模式
[a]
在游標右方進入輸入模式
[A]在游標所在行的行尾進入輸入模式
[o](小寫英文字母 o)
在游標下一行另起新行,並進入輸入模式
[O](大寫英文字母 o)
在游標上一行另起新行,並進入輸入模式

2008年4月8日 星期二

SIP Intro --- SDP

SDP

RFC2327裡的會用到的ㄧ些重要資訊。


以下原文取自RFC3264
RFC 2543 [10] specified that placing a user on hold was complished by setting the connection address to 0.0.0.0. Its usage for putting a call on hold is no longer recommended, since it doesn’t allow for RTCP to be used with held streams, doesn’t work with IPv6, and breaks with connection oriented media. However, it can be useful in an initial offer when the offerer knows it wants to use a particular set of media streams and formats, but doesn’t know the addresses and ports at the time of the offer. Of course, when used, the port number MUST NOT be zero, which would specify that the stream has been disabled. An agent MUST be capable of receiving SDP with a connection address of 0.0.0.0, in which case it means that neither RTP nor RTCP should be sent to the peer.

SIP Intro --- Audio Codecs

Codecs

音訊編解碼標準

PCMU(G.711U)
類型:Audio
制定者:ITU-T
所需頻寬:64Kbps(90.4)
特性:PCMU和PCMA都能提供較好的語音品質,但是它們佔用的頻寬較高,需要64kbps。
優點:語音品質優
缺點:佔用的頻寬較高
應用領域:voip
版稅方式:Free
備註:PCMU and PCMA都能夠達到CD音質,但是它們消耗的頻寬也最多(64kbps)。如果網路頻寬比較低,可以選用低比特速率的編碼方法,如G.723或G.729,這兩種編碼的方法也能達到傳統長途電話的音質,但是需要很少的頻寬(G723需要5.3/6.3kbps,G729需要8kbps)。如果頻寬足夠並且需要更好的語音品質,就使用PCMU 和 PCMA,甚至可以使用寬頻的編碼方法G722(64kbps),這可以提供有高保真度的音質。
                                                                                                            


SIP Intro --- SDP (Offer/Answer)

SDP (Offer/Answer)

資料來源RFC3264




SDP Indicating Capabilities
v=0
o=carol 28908764872 28908764872 IN IP4 100.3.6.6
s=-
t=0 0
c=IN IP4 192.0.2.4
m=audio 0 RTP/AVP 0 1 3
a=rtpmap:0 PCMU/8000
a=rtpmap:1 1016/8000
a=rtpmap:3 GSM/8000
m=video 0 RTP/AVP 31 34
a=rtpmap:31 H261/90000
a=rtpmap:34 H263/90000



Assume that the caller, Alice, has included the following description
in her offer.
v=0
o=alice 2890844526 2890844526 IN IP4 host.anywhere.com
s=
c=IN IP4 host.anywhere.com
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000
m=video 51372 RTP/AVP 31
a=rtpmap:31 H261/90000
m=video 53000 RTP/AVP 32
a=rtpmap:32 MPV/90000



he returns the SDP below as the answer
v=0
o=bob 2890844730 2890844730 IN IP4 host.example.com
s=
c=IN IP4 host.example.com
t=0 0
m=audio 49920 RTP/AVP 0
a=rtpmap:0 PCMU/8000
m=video 0 RTP/AVP 31
m=video 53000 RTP/AVP 32
a=rtpmap:32 MPV/90000



Bob decides to change the port.
v=0
o=bob 2890844730 2890844731 IN IP4 host.example.com
s=
c=IN IP4 host.example.com
t=0 0
m=audio 65422 RTP/AVP 0
a=rtpmap:0 PCMU/8000
m=video 0 RTP/AVP 31
m=video 53000 RTP/AVP 32
a=rtpmap:32 MPV/90000
m=audio 51434 RTP/AVP 110
a=rtpmap:110 telephone-events/8000
a=recvonly



Alice accepts the additional media stream, and so generates the following answer:
v=0
o=alice 2890844526 2890844527 IN IP4 host.anywhere.com
s=
c=IN IP4 host.anywhere.com
t=0 0
m=audio 49170 RTP/AVP 0
a=rtpmap:0 PCMU/8000
m=video 0 RTP/AVP 31
a=rtpmap:31 H261/90000
m=video 53000 RTP/AVP 32
a=rtpmap:32 MPV/90000
m=audio 53122 RTP/AVP 110
a=rtpmap:110 telephone-events/8000
a=sendonly



One of N Codec Selection

The initial offer from Alice to Bob indicates a single audio stream with the three audio codecs that are available in the DSP.
v=0
o=alice 2890844526 2890844526 IN IP4 host.anywhere.com
s=
c=IN IP4 host.anywhere.com
t=0 0
m=audio 62986 RTP/AVP 0 4 18
a=rtpmap:0 PCMU/8000
a=rtpmap:4 G723/8000
a=rtpmap:18 G729/8000
a=inactive



Bob can support dynamic switching between PCMU and G.723. So, he sends the following answer
v=0
o=bob 2890844730 2890844731 IN IP4 host.example.com
s=
c=IN IP4 host.example.com
t=0 0
m=audio 54344 RTP/AVP 0 4
a=rtpmap:0 PCMU/8000
a=rtpmap:4 G723/8000
a=inactive



Alice can then select any one of these two codecs.
v=0
o=alice 2890844526 2890844527 IN IP4 host.anywhere.com
s=
c=IN IP4 host.anywhere.com
t=0 0
m=audio 62986 RTP/AVP 4
a=rtpmap:4 G723/8000
a=sendrecv



Bob accepts the single codec
v=0
o=bob 2890844730 2890844732 IN IP4 host.example.com
s=
c=IN IP4 host.example.com
t=0 0
m=audio 54344 RTP/AVP 4
a=rtpmap:4 G723/8000
a=sendrecv

2008年4月2日 星期三

DTMF Tone Generator (Free Software)

D

TMF tone generator software (free)


NCH Tone Generator (Free Software)

這個軟體是免費的,除非要有進階功能才需要付費,而且還額外提供ㄧ些處理音頻訊號的PLUGIN下載使用。

使用此工具在依照我之前有一篇介紹的DTMF tone的說明,就可以自己產生DTMF Tone了!!!

可以去NCH官網查看~

以下是轉貼自他的官網簡介~

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Typical Applications

Generation of test tones in radio and other studios for the alignment of levels.
Calibration and testing of audio equipment or speakers.
Tuning music instruments as an accurate reference tone.
Demonstration of audio principles to students.
Acoustics testing and equalisation.
Quality control and testing of sound cards.
White noise generator
Audio band signalling.
Hearing tests (under suitable medical supervision).

Features

Sine wave, square wave, triangular waveform, saw tooth waveform, impulse, white noise and pink noise.
Supports frequencies from 1Hz to 22kHz bandwidth (subject to sound card).
Multiple simultaneous tones (1 to 16 tones can be created at the same time) (useful to create harmonics).
Mono or separate stereo operation (ideal to create dual tones or 'beats').
Tone Sweeps (Log or Linear).
Plays tone or saves as wav file.


2008年3月31日 星期一

SIP Intro --- Standard Subscriber Line Tones

Line tones

取自E.182這個doc


E.182定義了標準會用到的Tones如下:

Dial tone: The exchange is ready to receive address information.

PABX internal dial tone: The PABX is ready to receive address information.

Special dial tone: Same as dial tone, but the caller’s line is subject to a specific condition, such as call diversion or a voice mail is available (e.g., "stutter dial tone").

Second dial tone: The network has accepted the address information, but additional information is required.

Ring: This named signal event causes the recipient to generate an alerting signal ("ring"). The actual tone or other indication used to render this named event is left up to the receiver. (This differs from the ringing tone, below, heard by the caller

Ringing tone: The call has been placed to the callee and a calling signal (ringing) is being transmitted to the callee. This tone is also called "ringback".

Special ringing tone: A special service, such as call forwarding or call waiting, is active at the called number.

Busy tone: The called telephone number is busy.

Congestion tone: Facilities necessary for the call are temporarily unavailable.

Calling card service tone: The calling card service tone consists of 60 ms of the sum of 941 Hz and 1477 Hz tones (DTMF ’#’), followed by 940 ms of 350 Hz and 440 Hz (U.S. dial tone), decaying exponentially with a time constant of 200 ms.

Special information tone: The callee cannot be reached, but the reason is neither "busy" nor "congestion". This tone should be used before all call failure announcements, for the benefit of automatic equipment.

Comfort tone: The call is being processed. This tone may be used during long post-dial delays, e.g., in international connections.

Hold tone: The caller has been placed on hold.

Record tone: The caller has been connected to an automatic answering device and is requested to begin speaking.

Caller waiting tone: The called station is busy, but has call waiting service.

Pay tone: The caller, at a payphone, is reminded to deposit additional coins.

Positive indication tone: The supplementary service has been activated.

Negative indication tone: The supplementary service could not be activated.

Off-hook warning tone: The caller has left the instrument off-hook for an extended period of time.


Call waiting tone: Another party wants to reach the subscriber.

Warning tone: The call is being recorded. This tone is not required in all jurisdictions.

Intrusion tone: The call is being monitored, e.g., by an operator.

CPE alerting signal: A tone used to alert a device to an arriving in-band FSK data transmission. A CPE alerting signal is a combined 2130 and 2750 Hz tone, both with tolerances of 0.5% and a duration of 80 to. 80 ms. The CPE alerting signal is used with ADSI services and Call Waiting ID services [14].

Payphone recognition tone: The person making the call or being called is using a payphone (and thus it is ill-advised to allow collect calls to such a person).


另外也定義Event與其encode

Event                     encoding (decimal)
_____________________________________________
Off Hook                                 64
On Hook                                  65
Dial tone                                66
PABX internal dial tone                  67
Special dial tone                        68
Second dial tone                         69
Ringing tone                             70
Special ringing tone                     71
Busy tone                                72
Congestion tone                          73
Special information tone                 74
Comfort tone                             75
Hold tone                                76
Record tone                              77
Caller waiting tone                      78
Call waiting tone                        79
Pay tone                                 80
Positive indication tone                 81
Negative indication tone                 82
Warning tone                             83
Intrusion tone                           84
Calling card service tone                85
Payphone recognition tone                86
CPE alerting signal (CAS)                87
Off-hook warning tone                    88
Ring                                     89


後續會做說明補充...

SIP Intro --- DTMF (轉貼&精簡)

DTMF (Dual Tone Multi-Frequency)
本文參考來源以及RFC2833


DTMF(Dual Tone Multi-Frequency)signaling,逐漸在全世界範圍內使用在按鍵式電話機上,因其提供更高的撥號速率,迅速取代了傳統轉盤式電話機使用的撥號脈衝信令。在VOIP中,DTMF仍是發揮著重要的作用。

一個DTMF信號由兩個頻率的音訊信號疊加構成。這兩個音訊信號的頻率來自兩組預分配的頻率組:行頻組或列頻組。每一對這樣的音訊信號唯一表示一個數位或符號。產生DTMF信號,就是利用兩個不同頻率的正弦波疊加以後形成的波形,解碼時則採用改進的Goertzel演算法,從頻域搜索兩個正弦波的存在。


1209 Hz   1336 Hz     1477 Hz    1633 Hz
ABC        DEF
697 Hz     1          2          3         A
GHI        JKL        MNO
770 Hz     4          5          6         B
PRS        TUV        WXY
852 Hz     7          8          9         C
oper
941 Hz     *          0          #         D


DTMF在VOIP中的解決方案
由於在IP網中的通信傳輸是採packet switch而不是傳統領域中的circuit switch以及IP網的不穩定的特性,DTMF在VOIP中應用的解決方案和傳統有所不同,並且暫時還未統一,有多種解決方案。主要有下列幾種:

1.用SIP的INFO方法攜帶DTMF信號

2.在RTP媒體傳輸中攜帶DTMF信號(此種又有In band與Out of band之分)

3.動態生成DTMF音訊信號



關於DTMF信號的時間間隔,CCITT對DTMF信號規定的指標是,傳送/接收率為每秒10個數字,即每個數字100ms。代表數字的音頻信號必須持續至少45ms,但不超過55ms。100ms內其他時間為靜音,以便區別連續的兩個按鍵信號。


Goertzel演算法
DTMF解碼即是在輸入信號中搜索出有效的行頻和列頻。計算數位信號的頻譜可以採用DFT及其快速演算法FFT,而在實現DTMF解碼時,採用Goertzel演算法要比FFT更快。通過FFT可以計算得到信號所有譜線,瞭解信號整個頻域資訊,而對於DTMF信號只用關心其8個行頻/列頻及其二次諧波資訊即可(二次諧波的資訊用於將DTMF信號與聲音信號區別開)。此時Goertzel演算法能更加快速的在輸入信號中提取頻譜資訊。

Discrete Fourier Transform (DFT)
Fast Fourier Transform (FFT)

2008年3月27日 星期四

SIP Intro --- REFER method

REFER method

講到這個method,就開始有點複雜了!

因為要有以前講過的觀念,然後加上REFER與Subscrib的概念。整個例子的流程會很大、Msg的量也會增加很多! 但是,又因為有了之前的基礎,因此可以省略很多個Msg的說明,所以我就可以把整個REFER這個例子的流程簡化了很多!

首先,REFER是用在CALL Transfer上面。以下就來說明一個例子吧,假設有A,B,C三個人,A打給B,然後HOLD B,再打給C,然後把B轉接給C。最後B與C結束通訊。

A INVITE B
A HOLD B
A INVITE C
A HOLD C
A REFER B TO C
B INVITE C
C BYE A
A BYE B
...
C BYE B (or B BYE C)

而CALL Transfer又不只一種形式,其中有兩種較為常見,一種是Attended transfer,另一種為Blind transfer。前者為轉接者(發REFER的UA),在接通兩方電話後,再做Transfer,上面的例子就是Attended transfer。而後者為先接通一方電話,再發送REFER要求對方去CALL第三方。

在此先不探討CALL Transfer的方式,我將focus在REFER這個method的使用,以及其相關概念。

下面的CALL flow是一個在Dialog外的REFER,因此其To不會有tag。而在Dialog外或內也何差異?主要差異在於在Dialog內的REFER不會有Fork的產生,但在Dialog外的REFER則允許有Fork的產生。Fork有分支的意思,在此先簡單瞭解一下,當一個Event package允許使用Fork時,就會產生數個SUBSCRIBE requests,因而就能產生multiple subscriptions,就如同分支一樣,所以才稱之為Fork。(SUBSCRIBE概念會在另一篇說明)

先來看這個session外REFER的例子。再看後面的例子的時候,可以注意一下幾個Header fields的值~

Call-ID:
CSeq:
Event:
Subscription-State:

以下是在A與B建立好通訊之後的情況


Agent A             Agent B
|                        |
|       F1 REFER         |
|----------------------->|
|    F2 202 Accepted     |
|<-----------------------|
|       F3 NOTIFY        |
|<-----------------------|
|       F4 200 OK        |
|----------------------->|
|                        |
|                        |
|                        |------->
|                        | (whatever)
|                        |<------
|                        |
|      F5 NOTIFY         |
|<-----------------------|
|      F6 200 OK         |
|----------------------->|
|                        |
|                        |


Message One (F1)
REFER sip:b@atlanta.example.com SIP/2.0
Via: SIP/2.0/UDP agenta.atlanta.example.com;branch=z9hG4bK2293940223
To:
From: ;tag=193402342
Call-ID: 898234234@agenta.atlanta.example.com
CSeq: 93809823 REFER
Max-Forwards: 70
Refer-To: (whatever URI)
Contact: sip:a@atlanta.example.com
Content-Length: 0


Message Two (F2)
SIP/2.0 202 Accepted
Via: SIP/2.0/UDP agenta.atlanta.example.com;branch=z9hG4bK2293940223
To: ;tag=4992881234
From: ;tag=193402342
Call-ID: 898234234@agenta.atlanta.example.com
CSeq: 93809823 REFER
Contact: sip:b@atlanta.example.com
Content-Length: 0


Message Three (F3)
NOTIFY sip:a@atlanta.example.com SIP/2.0
Via: SIP/2.0/UDP agentb.atlanta.example.com;branch=z9hG4bK9922ef992-25
To: ;tag=193402342
From: ;tag=4992881234
Call-ID: 898234234@agenta.atlanta.example.com
CSeq: 1993402 NOTIFY
Max-Forwards: 70
Event: refer
Subscription-State: active;expires=(depends on Refer-To URI)
Contact: sip:b@atlanta.example.com
Content-Type: message/sipfrag;version=2.0
Content-Length: 20
SIP/2.0 100 Trying


Message Four (F4)
SIP/2.0 200 OK
Via: SIP/2.0/UDP agentb.atlanta.example.com;branch=z9hG4bK9922ef992-25
To: ;tag=193402342
From: ;tag=4992881234
Call-ID: 898234234@agenta.atlanta.example.com
CSeq: 1993402 NOTIFY
Contact: sip:a@atlanta.example.com
Content-Length: 0


Message Five (F5)
NOTIFY sip:a@atlanta.example.com SIP/2.0
Via: SIP/2.0/UDP agentb.atlanta.example.com;branch=z9hG4bK9323394234
To: ;tag=193402342
From: ;tag=4992881234
Call-ID: 898234234@agenta.atlanta.example.com
CSeq: 1993403 NOTIFY
Max-Forwards: 70
Event: refer
Subscription-State: terminated;reason=noresource
Contact: sip:b@atlanta.example.com
Content-Type: message/sipfrag;version=2.0
Content-Length: 16
SIP/2.0 200 OK


Message Six (F6)
SIP/2.0 200 OK
Via: SIP/2.0/UDP agentb.atlanta.example.com;branch=z9hG4bK9323394234
To: ;tag=193402342
From: ;tag=4992881234
Call-ID: 898234234@agenta.atlanta.example.com
CSeq: 1993403 NOTIFY
Contact: sip:a@atlanta.example.com
Content-Length: 0



以下為接續上面的例子,情況為在A在現有的Dialog裡,發送第二次REFER。(第一次REFER是在Dialog外)


Agent A               Agent B
|                        |
|       F7 REFER         |
|----------------------->|
|    F8 202 Accepted     |
|<-----------------------|
|       F9 NOTIFY        |
|<-----------------------|
|      F10 200 OK        |
|----------------------->|
|                        |------->
|                        | (something different)
|                        |<------
|                        |
|       F11 NOTIFY       |
|<-----------------------|
|       F12 200 OK       |
|----------------------->|
|                        |
|                        |


Message Seven (F7)
REFER sip:b@atlanta.example.com SIP/2.0
Via: SIP/2.0/UDP agenta.atlanta.example.com;branch=z9hG4bK9390399231
To: ;tag=4992881234
From: ;tag=193402342
Call-ID: 898234234@agenta.atlanta.example.com
CSeq: 93809824 REFER
Max-Forwards: 70
Refer-To: (some different URI)
Contact: sip:a@atlanta.example.com
Content-Length: 0


Message Eight (F8)
SIP/2.0 202 Accepted
Via: SIP/2.0/UDP agenta.atlanta.example.com;branch=z9hG4bK9390399231
To: ;tag=4992881234
From: ;tag=193402342
Call-ID: 898234234@agenta.atlanta.example.com
CSeq: 93809824 REFER
Contact: sip:b@atlanta.example.com
Content-Length: 0


Message Nine (F9)
NOTIFY sip:a@atlanta.example.com SIP/2.0
Via: SIP/2.0/UDP agentb.atlanta.example.com;branch=z9hG4bK9320394238995
To: ;tag=193402342
From: ;tag=4992881234
Call-ID: 898234234@agenta.atlanta.example.com
CSeq: 1993404 NOTIFY
Max-Forwards: 70
Event: refer;id=93809824
Subscription-State: active;expires=(depends on Refer-To URI)
Contact: sip:b@atlanta.example.com
Content-Type: message/sipfrag;version=2.0
Content-Length: 20
SIP/2.0 100 Trying


Message Ten (F10)
SIP/2.0 200 OK
Via: SIP/2.0/UDP agentb.atlanta.example.com;branch=z9hG4bK9320394238995
To: ;tag=193402342
From: ;tag=4992881234
Call-ID: 898234234@agenta.atlanta.example.com
CSeq: 1993404 NOTIFY
Contact: sip:a@atlanta.example.com
Content-Length: 0


Message Eleven (F11)
NOTIFY sip:a@atlanta.example.com SIP/2.0
Via: SIP/2.0/UDP agentb.atlanta.example.com;branch=z9hG4bK2994a93eb-fe
To: ;tag=193402342
From: ;tag=4992881234
Call-ID: 898234234@agenta.atlanta.example.com
CSeq: 1993405 NOTIFY
Max-Forwards: 70
Event: refer;id=93809824
Subscription-State: terminated;reason=noresource
Contact: sip:b@atlanta.example.com
Content-Type: message/sipfrag;version=2.0
Content-Length: 16
SIP/2.0 200 OK


Message Twelve (F12)
SIP/2.0 200 OK
Via: SIP/2.0/UDP agentb.atlanta.example.com;branch=z9hG4bK2994a93eb-fe
To: ;tag=193402342
From: ;tag=4992881234
Call-ID: 898234234@agenta.atlanta.example.com
CSeq: 1993405 NOTIFY
Contact: sip:a@atlanta.example.com
Content-Length: 0

2008年3月26日 星期三

SIP Intro --- CANCEL method

CANCEL method的介紹

本節將會介紹CANCEL這個method,因為最近有focus這部分。

這個例子之前有說過

Alice                     Bob
|                        |
|       INVITE F1        |
|----------------------->|
|    180 Ringing F2      |
|<-----------------------|
|                        |
|       200 OK F3        |
|<-----------------------|
|         ACK F4         |
|----------------------->|
|   Both Way RTP Media   |
|<======================>|
|                        |
|         BYE F5         |
|<-----------------------|
|       200 OK F6        |
|----------------------->|
|                        |


我將以這個為基礎,說明CANCEL這個method的用法。首先,CANCEL的用途在於取消掉某一個REQUEST(就如這個例子的INVITE),而使用時有一個前提,就是要在RESPONSE之前送出,也就是說如果已經收到RESPONSE(2XX),則不能送CANCEL了,只能送BYE。而且要接收到Provisional response後才能送CANCEL。

OK,有了傳送的條件後,再來說CANCEL要有什麼內容限制。Request-URI、Call-ID、To、CSeq的數字部分、From(也包含了其tags)必須要跟要取消掉的REQUEST的內容一致,還有Via裡只能有一個值,這個值只能是打算要取消掉的REQUEST的Via中第一筆數據。這個內容限制就是用來找出妳要CANCEL的REQUEST(transaction)。如果沒有符合以上內容,則收到CANCEL的User Agent無法找到對應的transaction(call),UA就會回覆一個481 Call/Transaction does not exist。

符合有了以上的規範,才能正確的cancel掉妳想要cancel的request,UA就會回覆一個487 Request terminated!

成功CANCEL就會如下

Alice                      Bob
|                           |
|         INVITE F1         |
|-------------------------->|
|      180 Ringing F2       |
|<--------------------------|
|         CANCEL F3         |
|-------------------------->|
| 487 Request terminated F4 |
|<--------------------------|
|           ACK F5          |
|-------------------------->|



不成功的會像下面這樣子

Alice                         Bob
|                           |
|         INVITE F1         |
|-------------------------->|
|      180 Ringing F2       |
|<--------------------------|
|         CANCEL F3         |
|-------------------------->|
|   481 Call not exist F4   |(Call/Transaction 
|<--------------------------|  does not exist)
|           ACK F5          |
|-------------------------->|


以下是用Etherea抓的INVITE與CANCEL,可以參考對照一下。



2008年3月20日 星期四

SIP之閒言閒語 (part 2)

SIP之閒言閒語 (part 2)

簡單說明怎麼玩SIP


首先先裝個JRE(去SUN網站下載,免費的)
安裝很容易,執行~按確定就對了~

在來裝OnDo SIP server(裝JRE就是為了他)
安裝方式也是執行~按確定就對了~

安裝完後,在你的程式集裡會有他的程式捷徑,裡面有一個叫做"Brekeke SIP Server Admintool",這個是ㄧ個連結,他會用IE開啟,並進入管理者登入畫面(帳號/密碼預設為sa/sa)。

登入後,有很多設定!包含伺服器的、SIP的等等。(先別急著動,等你的softphone裝好,測試能打後再來玩!)

接著裝softphone,應該也是執行~按確定就是了!

最後按裝Ethereal(安裝我的版本,要在安裝WinCap,應該有版本出來,或許就不這樣裝兩個了)

在來怎麼玩呢?先設定好softphone的註冊設定

在箭頭地方按右鍵


按下add,新增一個SIP帳號


填入資料(填這一頁資料即可)


此時就會出現你的帳號了,記得要勾起來


如此就完成了設定,接下來就是測試撥號! 你可以在裝一個softphone在你同一台電腦上(或者不同台上),設定方式一樣,只是號碼要不同,就可以互打。

如果測試通話ok,那就開始抓packet。首先開啟Ethereal。

選擇圖中的按鈕


進入設定視窗,在上方選擇你要monitor的網卡


右下角,那六個選項都要選,比較常用


按下確定後,就開始抓packets了


可以在此輸入你要filter的protocol名稱,在此我們輸入sip(注意要小寫),然後apply


若覺得packets抓得夠了,就按下右邊圈起來的鈕,他就會停止,中間是用現有設定重新開始,左邊是用新的設定


在任一個封包上按右鍵,選擇在新視窗開啟...如此就可以同時比較多個packet了


SIP message則會顯示在上方圖片的藍色窗格中!
以上就完成了封包抓取的動作,可以真正開始玩SIP了,在你要打電話時,把Ethereal先開起來再打,這樣就可以抓到完整的packets。

以上閒言閒語就到此結束拉!

2008年3月19日 星期三

SIP之閒言閒語 (part 1)

SIP之閒言閒語!

寫了兩部SIP的小簡介~ (第三部正努力中...><),休息一下! 扯一點SIP別的東東~
看了那麼多的SIP內容,全都在紙上談兵! 真的不夠有趣,對吧?

那就準備一下下面的東西! 來驗證一下SIP吧!

1. SIP Soft Phone (網路上應該有不少免費版可玩~我是用eyebeam與X-Lite)
2. SIP server (我是用OnDo Brekeke這個SIP server,不錯! 申請授權就可使用,免費!)
3. Ethereal (免費! 抓packets的軟體,會依照各個protocols去parse packets~ 對於驗證、除錯很有用!!)
4.JRE (JAVA的東東...可以去SUN網站下載,我是裝1.5板)

上面的軟體都是基本必備的! (當然妳有實體的網路電話也可以用喔! 註冊到妳的SIP server後,就可以互打了!)

準備好上面的就可以開始驗證我之前說的SIP 第一二部的東西囉!!

想自己TRY這些軟體的人就看到這裡就好啦!

不會使用的人或懶得去TRY的人,就看SIP之閒言閒語 (part 2)吧!!

PS.好多東西等著我要寫...SIP第三部...SIP 閒言閒語(part 2)...還有一些軟體想分享...但是太忙了...好吧!! 一樣一樣來!

SIP Intro 第三部

SIP Intro 第三部...

最近還是忙,但還是先起個頭,這一部想介紹Registration,也是一樣從例子開始入手,再一一其內容、結構與流程,因為有了一、二部的基礎,我想在這一部會開始往旁邊發展,也就是說會牽扯比較多一點的東西。

ps.實在對一些網誌高手不好意思,本人第一次寫,而且向來超不會寫文章...還請多多指教、包含!

下面是之前的SIP Intro 一二部,有興趣的可以參考!
SIP Intro --- 第一部
SIP Intro --- 第二部(part 1)
SIP Intro --- 第二部(part 2)
SIP Intro --- 第二部 (part 3)

進入正題!

為何要REGISTER呢? 因為若不向SIP server註冊,那別人怎麼能知道你在哪裡,又怎麼跟妳通訊呢? 所以我們每個User都要向SIP server至少註冊一個號碼,如此,當別人要跟這個號碼做通訊時,才找的到位置。

而一筆(號碼)註冊的資訊,我們又稱之為Address of Record,裡面包含了IP、號碼等等資訊。而註冊的流程有如何呢?以下先來看一個例子,下面這個例子是在表示一個user要註冊一筆新的資訊的流程。

Bob               SIP Server
| |
| REGISTER F1 | (向SIP server發送一個註冊的Msg)
|-------------------->|
| 401 Unauthorized F2 | (SIP server會要求認證)
|<--------------------|
| REGISTER F3 | (重新發送一次,並加入認證資訊)
|-------------------->|
| 200 OK F4 | (若成功,則會回OK給user)
|<--------------------|
| |



F1 REGISTER Bob -> SIP Server
REGISTER sips:ss2.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.biloxi.example.com:5061;branch=z9hG4bKnashds7
Max-Forwards: 70
From: Bob ;tag=a73kszlfl
To: Bob
Call-ID: 1j9FpLxk3uxtm8tn@biloxi.example.com
CSeq: 1 REGISTER
Contact:
Content-Length: 0


第一個packet裡

F2 401 Unauthorized SIP Server -> Bob
SIP/2.0 401 Unauthorized
Via: SIP/2.0/TLS client.biloxi.example.com:5061;branch=z9hG4bKnashds7
;received=192.0.2.201
From: Bob ;tag=a73kszlfl
To: Bob ;tag=1410948204
Call-ID: 1j9FpLxk3uxtm8tn@biloxi.example.com
CSeq: 1 REGISTER
WWW-Authenticate: Digest realm="atlanta.example.com",qop="auth",nonce="ea9c8e88df84f1cec4341ae6cbe5a359",opaque="",stale=FALSE,algorithm=MD5
Content-Length: 0


F3 REGISTER Bob -> SIP Server
REGISTER sips:ss2.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.biloxi.example.com:5061;branch=z9hG4bKnashd92
Max-Forwards: 70
From: Bob ;tag=ja743ks76zlflH
To: Bob
Call-ID: 1j9FpLxk3uxtm8tn@biloxi.example.com
CSeq: 2 REGISTER
Contact:
Authorization: Digest username="bob",realm="atlanta.example.com",nonce="ea9c8e88df84f1cec4341ae6cbe5a359", opaque="",uri="sips:ss2.biloxi.example.com",response="dfe56131d1958046689d83306477ecc"
Content-Length: 0


F4 200 OK SIP Server -> Bob
SIP/2.0 200 OK
Via: SIP/2.0/TLS client.biloxi.example.com:5061;branch=z9hG4bKnashd92 ;received=192.0.2.201
From: Bob ;tag=ja743ks76zlflH
To: Bob ;tag=37GkEhwl6
Call-ID: 1j9FpLxk3uxtm8tn@biloxi.example.com
CSeq: 2 REGISTER
Contact: ;expires=3600
Content-Length: 0



下一個例子,是在表示user想要對他註冊的Address of Record做更新的operation。

   Bob                        SIP Server
| |
| REGISTER F1 |
|------------------------------>|
| 200 OK F2 |
|<------------------------------|
| |


F1 REGISTER Bob -> SIP Server
REGISTER sips:ss2.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.biloxi.example.com:5061;branch=z9hG4bKnashds7
Max-Forwards: 70
From: Bob ;tag=a73kszlfl
To: Bob
Call-ID: 1j9FpLxk3uxtm8tn@biloxi.example.com
CSeq: 1 REGISTER
Contact: mailto:bob@biloxi.example.com
Authorization: Digest username="bob",realm="atlanta.example.com",qop="auth", nonce="1cec4341ae6cbe5a359ea9c8e88df84f",opaque="",uri="sips:ss2.iloxi.example.com", response="71ba27c64bd01de719686aa4590d5824"
Content-Length: 0


F2 200 OK SIP Server -> Bob
SIP/2.0 200 OK
Via: SIP/2.0/TLS client.biloxi.example.com:5061;branch=z9hG4bKnashds7;received=192.0.2.201
From: Bob ;tag=a73kszlfl
To: Bob ;tag=34095828jh



再來這個例子是user要求現有的註冊資訊。
   Bob                        SIP Server
| |
| REGISTER F1 |
|------------------------------>|
| 200 OK F2 |
|<------------------------------|
| |


F1 REGISTER Bob -> SIP Server
REGISTER sips:ss2.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.biloxi.example.com:5061;branch=z9hG4bKnashds7
Max-Forwards: 70
From: Bob ;tag=a73kszlfl
To: Bob
Call-ID: 1j9FpLxk3uxtm8tn@biloxi.example.com
CSeq: 1 REGISTER
Authorization: Digest username="bob",realm="atlanta.example.com",nonce="df84f1cec4341ae6cbe5ap359a9c8e88",opaque="",uri="sips:ss2.biloxi.example.com",response="aa7ab4678258377c6f7d4be6087e2f60"
Content-Length: 0


F2 200 OK SIP Server -> Bob
SIP/2.0 200 OK
Via: SIP/2.0/TLS client.biloxi.example.com:5061;branch=z9hG4bKnashds7;received=192.0.2.201



接下來這個例子是取消註冊。


   Bob                         SIP Server
| |
| REGISTER F1 |
|------------------------------>|
| 200 OK F2 |
|<------------------------------|
| |



F1 REGISTER Bob -> SIP Server
REGISTER sips:ss2.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.biloxi.example.com:5061;branch=z9hG4bKnashds7
Max-Forwards: 70
From: Bob ;tag=a73kszlfl
To: Bob
Call-ID: 1j9FpLxk3uxtm8tn@biloxi.example.com
CSeq: 1 REGISTER
Expires: 0
Contact: *
Authorization: Digest username="bob", realm="atlanta.example.com",nonce="88df84f1cac4341aea9c8ee6cbe5a359", opaque="",uri="sips:ss2.biloxi.example.com",response="ff0437c51696f9a76244f0cf1dbabbea"
Content-Length: 0


F2 200 OK SIP Server -> Bob
SIP/2.0 200 OK
Via: SIP/2.0/TLS client.biloxi.example.com:5061;branch=z9hG4bKnashds7;received=192.0.2.201
From: Bob ;tag=a73kszlfl
To: Bob ;tag=1418nmdsrf
Call-ID: 1j9FpLxk3uxtm8tn@biloxi.example.com
CSeq: 1 REGISTER
Content-Length: 0



最後是ㄧ個註冊不成功的例子,這只是其中之一,因為不成功的可能原因太多了,所以只列一個。

   Bob                        SIP Server
| |
| REGISTER F1 |
|------------------------------>|
| 401 Unauthorized F2 |
|<------------------------------|
| REGISTER F3 |
|------------------------------>|
| 401 Unauthorized F4 |
|<------------------------------|
| |


F1 REGISTER Bob -> SIP Server


REGISTER sips:ss2.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.biloxi.example.com:5061;branch=z9hG4bKnashds7;received=192.0.2.201
From: Bob ;tag=a73kszlfl
To: Bob
Call-ID: 1j9FpLxk3uxtm8tn@biloxi.example.com
CSeq: 1 REGISTER
Contact:
Content-Length: 0


F2 Unauthorized SIP Server -> Bob
SIP/2.0 401 Unauthorized
Via: SIP/2.0/TLS client.biloxi.example.com:5061;branch=z9hG4bKnashds7;received=192.0.2.201
From: Bob ;tag=a73kszlfl
To: Bob ;tag=1410948204
Call-ID: 1j9FpLxk3uxtm8tn@biloxi.example.com
CSeq: 1 REGISTER
WWW-Authenticate: Digest realm="atlanta.example.com", qop="auth",nonce="f1cec4341ae6ca9c8e88df84be55a359", opaque="", stale=FALSE, algorithm=MD5
Content-Length: 0


F3 REGISTER Bob -> SIP Server
REGISTER sips:ss2.biloxi.example.com SIP/2.0
Via: SIP/2.0/TLS client.biloxi.example.com:5061;branch=z9hG4bKnashd92
Max-Forwards: 70
From: Bob ;tag=JueHGuidj28dfga
To: Bob
Call-ID: 1j9FpLxk3uxtm8tn@biloxi.example.com
CSeq: 2 REGISTER
Contact:
Authorization: Digest username="bob", realm="atlanta.example.com",nonce="f1cec4341ae6ca9c8e88df84be55a359", opaque="",
uri="sips:ss2.biloxi.example.com",
response="61f8470ceb87d7ebf508220214ed438b"
Content-Length: 0


F4 401 Unauthorized SIP Server -> Bob
SIP/2.0 401 Unauthorized
Via: SIP/2.0/TLS client.biloxi.example.com:5061;branch=z9hG4bKnashd92;received=192.0.2.201
From: Bob ;tag=JueHGuidj28dfga
To: Bob ;tag=1410948204
Call-ID: 1j9FpLxk3uxtm8tn@biloxi.example.com
CSeq: 2 REGISTER
WWW-Authenticate: Digest realm="atlanta.example.com", qop="auth",nonce="84f1c1ae6cbe5ua9c8e88dfa3ecm3459",opaque="", stale=FALSE, algorithm=MD5
Content-Length: 0




搜尋此網誌