2009年6月17日 星期三

rsync 參數設定及範例

rsync 資料同步 的參數設定
此篇文章是從http://support.clara.com.tw/index.php?_m=knowledgebase&_a=viewarticle&kbarticleid=66看到的
基本上是man rsync的中譯版本而以,但還是讓我省了一些功夫去看英文的
(沒辦法..要多一道翻譯的功夫實在是有點累人)

◎語法:
rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST

rsync [OPTION]... [USER@]HOST:SRC DEST

rsync [OPTION]... SRC [SRC]... DEST

rsync [OPTION]... [USER@]HOST::SRC [DEST]

rsync [OPTION]... SRC [SRC]... [USER@]HOST::DEST

rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]

rsync [OPTION]... SRC [SRC]... rsync://[USER@]HOST[:PORT]/DEST

◎使用模式:
o 當來源端或目的端的路徑都未包含 : 這個分隔符號時,表示複製本地端的檔案.

o 當目的端路徑包含單個 : 這個分隔符號時,表示複製本地端檔案到遠端機器(透過ssh或rsh).

o 當來源端路徑包含 : 這個分隔符號時,表示複製遠端檔案到本地端.

o 當來源端路徑包含 :: 或 rsync:// 這個符號時,表示從遠端rsync伺服器複製檔案到本地端.

o 當目的端路徑包含 :: 或 rsync:// 這個符號時,表示從本地端複製檔案到rsync伺服器.

o 當來源端路徑包含 :: 和加上--rsh=COMMANS (-e COMMAND)參數,表示使用遠端shell程式
 (remote shell)並透過遠端的rsync伺服器,複製遠端檔案到本地端

o 當目的端路徑抱含 :: 和加上--rsh=COMMAND 參數,表示使用遠端shell程式並透過遠端的rsync伺服器,
 複製本地端檔案到遠端機器

o 列出遠端機器的檔案,跟rsync傳輸相同,只不過把本地端的目的地位置留空.

注意: 在所有狀況下(列出遠端機器檔案除外),來源端及目的端的路徑最少要有一個是本地端路徑.


◎使用方式:
rsync -t *.c foo:src/
傳輸目前路徑下所有符合*.c檔案,到foo這台機器的src資料夾.

rsync -avz foo:src/bar /data/tmp
傳輸foo機器src/bar資料夾下的所有檔案到 /data/tmp 資料夾.
-a 表示archive模式,也就是保持原有的檔案權限.
-z 表示傳輸時壓縮資料.

檔案傳輸來源後加上一個/可以避免再目的資料夾下額外建立出一個資料夾.
你可以把來源有沒有/這個符號結尾,想像成"複製這個資料夾下的內容"和"複製這個資料夾\\\".
如: rsync -av /src/foo /dest 則會在 /dest產生一個foo資料夾;
rsync -av /src/foo/ /dest 則不會


◎安裝方式:
安裝了rsync服務,就可以透過remote shell來比對傳輸機器間的檔案.
預設rsync使用ssh在機器間溝通及傳輸.(可以透過 -e 參數修改)
需要注意的是,來源端和目的端的機器都必須安裝有rsync

rysnc client端:安裝rsync只是為了取得rsync這個執行檔案.
路徑: /usr/ports/net/rsync/


a.設定用來和rsync伺服端連結的密碼檔,內容為密碼.(密碼要和伺服端相同)
路徑: /usr/local/etc/rsyncd.secret
(檔案名稱及路徑可以自行變更,執行時在--password-file 指定即可)

某些rsync伺服器需要進行身分認證,當您與這些伺服器連結時,系統會要求您輸入密碼.
您可以透過設定密碼到 RSYNC_PASSWORD 這個環境變數,來避免此狀況發生.
(這個在FreeBSD上面好像是無效的.)


rsync伺服端:伺服端的機器也要安裝 (路徑:/usr/ports/net/rsync/ ,安裝方式同client端).
a.設定 /usr/local/etc/rsyncd.conf rsyncd 的設定檔:

說明:
[ohaha]: rsync區段的設定名稱
path: 備份資料存放的路徑
auth users: 連結rsync服務的帳號
uid,gid: 採用何種身分進行檔案存取
secerts file: 帳號密碼檔位置
read only: 是否唯讀


b.設定給rsync client端傳輸用的帳號及密碼,並且更改權限為root唯讀(600)
格式: 帳號:密碼 (每行一組,帳號和密碼用:分隔,此例帳號為ohaha密碼為ohahabackup)
路徑: /usr/local/etc/rsyncd.secret
(檔案名稱及路徑可以自行變更,與rysncd.conf中的設定相同即可)

c.修改 /etc/rc.conf 新增 rsyncd_enble="YES" (開機自動執行)

d.啟動 rsyncd 服務


◎參數:
-h , --help 顯示rsync求助資訊.

--version 顯示rsync版本.

-v , --verbose 複雜的輸出訊息.

-q , --quiet 安靜模式,幾乎沒有訊息產生.常用在以cron執行rsync.

-I, --ignore-times 通常rsync為了加快速度會忽略同樣檔案大小且同樣存取時間點的檔案.
  可以透過此參數關閉此快速檢查.

--size-only rsync只檢查檔案大小是否改變,不管時間存取點是否改變.
  通常用在mirror,且對方時間不太正確時.

-c, --checksum 在傳送之前透過128bit的md4檢查碼來檢查所有要傳送的檔案.(會拖慢速度.)

-a, --archive archive mode 權限保存模式,相當於 -rlptgoD 參數.
  很快速的保存幾乎所有的權限設定,除了硬式連結(透過-H設定).

-r, --recursive 複製所有下層的資料(遞迴)

-R, --relative 使用相對路徑.
如: rsync foo/bar/foo.c remote:/tmp/ 在遠端產生/tmp/foo.c檔案
rsync -R foo/bar/foo.c remote:/tmp/ 在遠端產生/tmp/foo/bar/foo.c 檔案

-R, --no-relative 不使用相對路徑.

-b, --backup 目的地端先前已經存在的檔案在傳輸或刪除前會被備份.
  --backup-dir=DIR 設定備份的資料夾.
  --suffix=SUFFIX 指定備份的檔案名稱字尾形式(預設為~).

-K, --keep-dirlinks 接收方將連結到資料夾的檔案視為資料夾處理

-l, --links 複製所有的連結

-H, --hard-links 保留硬式連結

-p, --perms 保留檔案權限

-o, --owner 保留檔案擁有者(root only)

-g, --group 保留檔案群組

-D, --devices 保留device資訊(root only)

-t, --times 保留時間點

-n, --dry-run 不實際執行傳送,只顯示將會有的傳輸動作

-S, --sparse 嘗試去處理稀疏的檔案,讓這些檔案在目的端佔去較少的磁碟空間.

-W, --whole-file 複製所有的檔案,不額外作檢查.
  --no-whole-file 關閉 --whole-file 參數

-x, --one-file-system 不要跨越檔案系統分界(只在一個檔案系統處理)

-B, --block-size=SIZE 強制透過rsync程式去比對修復block-sizeforce

-e --rsh=COMMAND 定義所使用的remote shell

--rsync-path=PATH 定義rsync在遠端機器存放資料的路徑

--existing 只比對更新目的端已經存在的檔案

--ignore-existing 忽略目的端已經存在的檔案(也就是不更新)

--delete 刪除傳送端已經不存在,而目的端存在的檔案

--delete-excluded 除了把傳送端已經不存在,而目的端存在的檔案刪除之外,
  也刪除 --exclude 參數所包含的檔案.

--delete-after rsync預設會在檔案傳送前進行相關刪除動作確保接收端有足夠的檔案空間,
  但可以透過 --delete-after 讓刪除動作在檔案傳送後再行刪除.

--ignore-errors 忽略任何錯誤既使是I/O error 也進行 --delete 刪除動作.

--max-delete=NUM 定義rsync不要刪除超過 NUM 個檔案.

--partial rsync若遇到傳輸過程中斷時,會把那些已經傳輸的檔案刪除.
 在某種狀況下保留那些部分傳送的檔案是令人高興的. 你可以透過 --partial 參數達到這個目的.

--partial-dir=DIR 在 --partial 參數啟動時,你還可以定義rsync把那些部分傳送的檔案
 寫入定義的資料夾,而非直接寫入目的端.需要注意的是, 此資料夾不應該被其他使用者可以寫入.(如:/tmp)

--force 當目的端資料夾被傳送端非資料夾名稱覆蓋時,強制rsync刪除資料夾,
 即使該資料夾不是空的.

--numeric-ids 不將傳送端檔案的uid及gid值,與目的端的使用者/群組進行配對.
 若傳送端並沒有uid及gid的對應名稱(如:原帳號群組被刪除的遺留檔案),
 或目的端沒有相對應的帳號/群組,保留數字型態的uid/gid

--timeout=TIMEOUT 設定 I/O 逾時的時間(秒). 超過這個秒數而沒有資料傳送,rsync將會結束.
 預設為0,也就是沒有定義逾時時間.

-T, --temp-dir=DIR 定義rsync在接收端產生暫時性的複製檔案時使用資料夾暫存.
 預設是直接在接收端資料夾直接產生暫存檔案.

--compare-dest=DIR 定義rsync在目的端建立資料夾來比對傳送過來的檔案.

--link-dest=DIR 與 --compare-dest 相同,但同時會針對無法改變的檔案建立硬式連結.

-z, --compress 壓縮模式,當資料在傳送到目的端進行檔案壓縮.

-P -P參數和 --partial --progress 相同.只是為了把參數簡單化.

-C, --cvs-exclude 排除那些通常不希望傳送的檔案.定義的方式與CVS傳送相同:
RCS SCCS CVS CVS.adm RCSLOG cvslog.* tags TAGS .make.state
.nse_depinfo *~ #* .#* ,* _$* *$ *.old *.bak *.BAK *.orig *.rej
.del-* *.a *.olb *.o *.obj *.so *.exe *.Z *.elc *.ln core .svn/
符合以上條件的都會被忽略而不傳送.

--exclude=PATTER 符合PATTERN(規則表示式)樣式的檔案不進行傳送

--exclude-from=FILE 和--exclude參數相同,不過是把不進行傳送的檔案事先寫入某一檔案.
執行時,透過此參數讓rsync讀取.
(; #開頭的行列或空白行會被rsync忽略)

--include=PATTERN 定義rsync不要排除符合pattern樣式的檔案.

--include-from=FILE 和--include參數相同,只不過把要包含的檔案寫到某一檔案.

--files-from=FILE 把要傳送的檔案名稱都精確的寫入某一檔案,讓rsync讀取.
如: rsync -a --files-from=/tmp/foo /usr remote:/backup

-0 --from0 定義檔案所要讀取的檔案是null字元結尾.

--version 顯示版本訊息.

--daemon 定義rsync以daemon型態執行.

--no-detach 當以daemon型態執行時,不要進行分裂且變成背景程序.

--address=ADDRESS 定義所要連結(bind)的ip位址或是host名稱(daemon限定)

--config=FILE 定義所要讀取的設定檔rsyncd.conf位置(daemon限定)
預設值為 /usr/local/etc/rsyncd.conf

--port=PORT 定義rsyncd(daemon)要執行的port(預設為tcp 873)

--blocking-io 使用blocking I/O連結遠端的shell,如rsh , remsh

--no-blocking-io 使用non-blocking連結遠端的shell,如ssh (預設值)

--stats 顯示檔案傳送時的資訊狀態

--progress 顯示傳送的進度.(給檔案傳送時,怕無聊的人用的..)

--log-format=FORMAT 定義log的格式(在rsyncd.conf設定)

--password-file=FILE 從檔案讀取與遠端rsync伺服器連結的密碼

--bwlimit=KBPS 定義傳輸頻寬的大小(KBytes/秒)

--write-batch=FILE 把紀錄資料寫入一個檔案(給其他相同環境且相同需求的機器使用)

--read-batch=FILE 透過讀取紀錄檔案來進行傳輸.(檔案由 --write-batch 參數產生)

--checksum-seed=NUM 定義檔案 checksum-seed 的大小(byte)

-4 --ipv4 使用IPv4協定

-6 --ipv6 使用IPv6協定

◎傳輸實作:
實例:備份 ohaha.ks.edu.tw 的所有網頁內容(/usr/local/www/data/).
rsync 伺服端: backup.mlc.edu.tw
rsync client: ohaha.ks.edu.tw

分別設定好伺服端(bakcup)及client端機器(ohaha)的rsync服務.
在client端(ohaha)透過以下指令,把/usr/local/www/data/的所有資料透過rsync放到伺服端的
/backup/ohaha/data/ 資料夾下.
指令: rsync -rvlHpogDtS --password-file=/usr/local/etc/rsyncd.secrets /usr/local/www/data/ ohaha@backup.mlc.edu.tw::ohaha

說明: rsync 指令
rvlHpogDtS 參數 (部分參數可以用-a取代)
--password-file=/usr/local/etc/rsyncd.secrets 所要讀取的密碼檔位置
/usr/local/www/data/ 要備份的資料來源
ohaha@backup.mlc.edu.tw::ohaha 透過ohaha這個帳號,連結rsync伺服端(backup)的[ohaha]設定值.

◎檔案:
設定檔: /usr/local/etc/rsyncd.conf 或 rsyncd.conf

rsync 資料同步 的參數設定
此篇文章是從http://support.clara.com.tw/index.php?_m=knowledgebase&_a=viewarticle&kbarticleid=66看到的
基本上是man rsync的中譯版本而以,但還是讓我省了一些功夫去看英文的
(沒辦法..要多一道翻譯的功夫實在是有點累人)

◎語法:
rsync [OPTION]... SRC [SRC]... [USER@]HOST:DEST

rsync [OPTION]... [USER@]HOST:SRC DEST

rsync [OPTION]... SRC [SRC]... DEST

rsync [OPTION]... [USER@]HOST::SRC [DEST]

rsync [OPTION]... SRC [SRC]... [USER@]HOST::DEST

rsync [OPTION]... rsync://[USER@]HOST[:PORT]/SRC [DEST]

rsync [OPTION]... SRC [SRC]... rsync://[USER@]HOST[:PORT]/DEST

◎使用模式:
o 當來源端或目的端的路徑都未包含 : 這個分隔符號時,表示複製本地端的檔案.

o 當目的端路徑包含單個 : 這個分隔符號時,表示複製本地端檔案到遠端機器(透過ssh或rsh).

o 當來源端路徑包含 : 這個分隔符號時,表示複製遠端檔案到本地端.

o 當來源端路徑包含 :: 或 rsync:// 這個符號時,表示從遠端rsync伺服器複製檔案到本地端.

o 當目的端路徑包含 :: 或 rsync:// 這個符號時,表示從本地端複製檔案到rsync伺服器.

o 當來源端路徑包含 :: 和加上--rsh=COMMANS (-e COMMAND)參數,表示使用遠端shell程式
 (remote shell)並透過遠端的rsync伺服器,複製遠端檔案到本地端

o 當目的端路徑抱含 :: 和加上--rsh=COMMAND 參數,表示使用遠端shell程式並透過遠端的rsync伺服器,
 複製本地端檔案到遠端機器

o 列出遠端機器的檔案,跟rsync傳輸相同,只不過把本地端的目的地位置留空.

注意: 在所有狀況下(列出遠端機器檔案除外),來源端及目的端的路徑最少要有一個是本地端路徑.


◎使用方式:
rsync -t *.c foo:src/
傳輸目前路徑下所有符合*.c檔案,到foo這台機器的src資料夾.

rsync -avz foo:src/bar /data/tmp
傳輸foo機器src/bar資料夾下的所有檔案到 /data/tmp 資料夾.
-a 表示archive模式,也就是保持原有的檔案權限.
-z 表示傳輸時壓縮資料.

檔案傳輸來源後加上一個/可以避免再目的資料夾下額外建立出一個資料夾.
你可以把來源有沒有/這個符號結尾,想像成"複製這個資料夾下的內容"和"複製這個資料夾\\\".
如: rsync -av /src/foo /dest 則會在 /dest產生一個foo資料夾;
rsync -av /src/foo/ /dest 則不會


◎安裝方式:
安裝了rsync服務,就可以透過remote shell來比對傳輸機器間的檔案.
預設rsync使用ssh在機器間溝通及傳輸.(可以透過 -e 參數修改)
需要注意的是,來源端和目的端的機器都必須安裝有rsync

rysnc client端:安裝rsync只是為了取得rsync這個執行檔案.
路徑: /usr/ports/net/rsync/


a.設定用來和rsync伺服端連結的密碼檔,內容為密碼.(密碼要和伺服端相同)
路徑: /usr/local/etc/rsyncd.secret
(檔案名稱及路徑可以自行變更,執行時在--password-file 指定即可)

某些rsync伺服器需要進行身分認證,當您與這些伺服器連結時,系統會要求您輸入密碼.
您可以透過設定密碼到 RSYNC_PASSWORD 這個環境變數,來避免此狀況發生.
(這個在FreeBSD上面好像是無效的.)


rsync伺服端:伺服端的機器也要安裝 (路徑:/usr/ports/net/rsync/ ,安裝方式同client端).
a.設定 /usr/local/etc/rsyncd.conf rsyncd 的設定檔:

說明:
[ohaha]: rsync區段的設定名稱
path: 備份資料存放的路徑
auth users: 連結rsync服務的帳號
uid,gid: 採用何種身分進行檔案存取
secerts file: 帳號密碼檔位置
read only: 是否唯讀


b.設定給rsync client端傳輸用的帳號及密碼,並且更改權限為root唯讀(600)
格式: 帳號:密碼 (每行一組,帳號和密碼用:分隔,此例帳號為ohaha密碼為ohahabackup)
路徑: /usr/local/etc/rsyncd.secret
(檔案名稱及路徑可以自行變更,與rysncd.conf中的設定相同即可)

c.修改 /etc/rc.conf 新增 rsyncd_enble="YES" (開機自動執行)

d.啟動 rsyncd 服務


◎參數:
-h , --help 顯示rsync求助資訊.

--version 顯示rsync版本.

-v , --verbose 複雜的輸出訊息.

-q , --quiet 安靜模式,幾乎沒有訊息產生.常用在以cron執行rsync.

-I, --ignore-times 通常rsync為了加快速度會忽略同樣檔案大小且同樣存取時間點的檔案.
  可以透過此參數關閉此快速檢查.

--size-only rsync只檢查檔案大小是否改變,不管時間存取點是否改變.
  通常用在mirror,且對方時間不太正確時.

-c, --checksum 在傳送之前透過128bit的md4檢查碼來檢查所有要傳送的檔案.(會拖慢速度.)

-a, --archive archive mode 權限保存模式,相當於 -rlptgoD 參數.
  很快速的保存幾乎所有的權限設定,除了硬式連結(透過-H設定).

-r, --recursive 複製所有下層的資料(遞迴)

-R, --relative 使用相對路徑.
如: rsync foo/bar/foo.c remote:/tmp/ 在遠端產生/tmp/foo.c檔案
rsync -R foo/bar/foo.c remote:/tmp/ 在遠端產生/tmp/foo/bar/foo.c 檔案

-R, --no-relative 不使用相對路徑.

-b, --backup 目的地端先前已經存在的檔案在傳輸或刪除前會被備份.
  --backup-dir=DIR 設定備份的資料夾.
  --suffix=SUFFIX 指定備份的檔案名稱字尾形式(預設為~).

-K, --keep-dirlinks 接收方將連結到資料夾的檔案視為資料夾處理

-l, --links 複製所有的連結

-H, --hard-links 保留硬式連結

-p, --perms 保留檔案權限

-o, --owner 保留檔案擁有者(root only)

-g, --group 保留檔案群組

-D, --devices 保留device資訊(root only)

-t, --times 保留時間點

-n, --dry-run 不實際執行傳送,只顯示將會有的傳輸動作

-S, --sparse 嘗試去處理稀疏的檔案,讓這些檔案在目的端佔去較少的磁碟空間.

-W, --whole-file 複製所有的檔案,不額外作檢查.
  --no-whole-file 關閉 --whole-file 參數

-x, --one-file-system 不要跨越檔案系統分界(只在一個檔案系統處理)

-B, --block-size=SIZE 強制透過rsync程式去比對修復block-sizeforce

-e --rsh=COMMAND 定義所使用的remote shell

--rsync-path=PATH 定義rsync在遠端機器存放資料的路徑

--existing 只比對更新目的端已經存在的檔案

--ignore-existing 忽略目的端已經存在的檔案(也就是不更新)

--delete 刪除傳送端已經不存在,而目的端存在的檔案

--delete-excluded 除了把傳送端已經不存在,而目的端存在的檔案刪除之外,
  也刪除 --exclude 參數所包含的檔案.

--delete-after rsync預設會在檔案傳送前進行相關刪除動作確保接收端有足夠的檔案空間,
  但可以透過 --delete-after 讓刪除動作在檔案傳送後再行刪除.

--ignore-errors 忽略任何錯誤既使是I/O error 也進行 --delete 刪除動作.

--max-delete=NUM 定義rsync不要刪除超過 NUM 個檔案.

--partial rsync若遇到傳輸過程中斷時,會把那些已經傳輸的檔案刪除.
 在某種狀況下保留那些部分傳送的檔案是令人高興的. 你可以透過 --partial 參數達到這個目的.

--partial-dir=DIR 在 --partial 參數啟動時,你還可以定義rsync把那些部分傳送的檔案
 寫入定義的資料夾,而非直接寫入目的端.需要注意的是, 此資料夾不應該被其他使用者可以寫入.(如:/tmp)

--force 當目的端資料夾被傳送端非資料夾名稱覆蓋時,強制rsync刪除資料夾,
 即使該資料夾不是空的.

--numeric-ids 不將傳送端檔案的uid及gid值,與目的端的使用者/群組進行配對.
 若傳送端並沒有uid及gid的對應名稱(如:原帳號群組被刪除的遺留檔案),
 或目的端沒有相對應的帳號/群組,保留數字型態的uid/gid

--timeout=TIMEOUT 設定 I/O 逾時的時間(秒). 超過這個秒數而沒有資料傳送,rsync將會結束.
 預設為0,也就是沒有定義逾時時間.

-T, --temp-dir=DIR 定義rsync在接收端產生暫時性的複製檔案時使用資料夾暫存.
 預設是直接在接收端資料夾直接產生暫存檔案.

--compare-dest=DIR 定義rsync在目的端建立資料夾來比對傳送過來的檔案.

--link-dest=DIR 與 --compare-dest 相同,但同時會針對無法改變的檔案建立硬式連結.

-z, --compress 壓縮模式,當資料在傳送到目的端進行檔案壓縮.

-P -P參數和 --partial --progress 相同.只是為了把參數簡單化.

-C, --cvs-exclude 排除那些通常不希望傳送的檔案.定義的方式與CVS傳送相同:
RCS SCCS CVS CVS.adm RCSLOG cvslog.* tags TAGS .make.state
.nse_depinfo *~ #* .#* ,* _$* *$ *.old *.bak *.BAK *.orig *.rej
.del-* *.a *.olb *.o *.obj *.so *.exe *.Z *.elc *.ln core .svn/
符合以上條件的都會被忽略而不傳送.

--exclude=PATTER 符合PATTERN(規則表示式)樣式的檔案不進行傳送

--exclude-from=FILE 和--exclude參數相同,不過是把不進行傳送的檔案事先寫入某一檔案.
執行時,透過此參數讓rsync讀取.
(; #開頭的行列或空白行會被rsync忽略)

--include=PATTERN 定義rsync不要排除符合pattern樣式的檔案.

--include-from=FILE 和--include參數相同,只不過把要包含的檔案寫到某一檔案.

--files-from=FILE 把要傳送的檔案名稱都精確的寫入某一檔案,讓rsync讀取.
如: rsync -a --files-from=/tmp/foo /usr remote:/backup

-0 --from0 定義檔案所要讀取的檔案是null字元結尾.

--version 顯示版本訊息.

--daemon 定義rsync以daemon型態執行.

--no-detach 當以daemon型態執行時,不要進行分裂且變成背景程序.

--address=ADDRESS 定義所要連結(bind)的ip位址或是host名稱(daemon限定)

--config=FILE 定義所要讀取的設定檔rsyncd.conf位置(daemon限定)
預設值為 /usr/local/etc/rsyncd.conf

--port=PORT 定義rsyncd(daemon)要執行的port(預設為tcp 873)

--blocking-io 使用blocking I/O連結遠端的shell,如rsh , remsh

--no-blocking-io 使用non-blocking連結遠端的shell,如ssh (預設值)

--stats 顯示檔案傳送時的資訊狀態

--progress 顯示傳送的進度.(給檔案傳送時,怕無聊的人用的..)

--log-format=FORMAT 定義log的格式(在rsyncd.conf設定)

--password-file=FILE 從檔案讀取與遠端rsync伺服器連結的密碼

--bwlimit=KBPS 定義傳輸頻寬的大小(KBytes/秒)

--write-batch=FILE 把紀錄資料寫入一個檔案(給其他相同環境且相同需求的機器使用)

--read-batch=FILE 透過讀取紀錄檔案來進行傳輸.(檔案由 --write-batch 參數產生)

--checksum-seed=NUM 定義檔案 checksum-seed 的大小(byte)

-4 --ipv4 使用IPv4協定

-6 --ipv6 使用IPv6協定

◎傳輸實作:
實例:備份 ohaha.ks.edu.tw 的所有網頁內容(/usr/local/www/data/).
rsync 伺服端: backup.mlc.edu.tw
rsync client: ohaha.ks.edu.tw

分別設定好伺服端(bakcup)及client端機器(ohaha)的rsync服務.
在client端(ohaha)透過以下指令,把/usr/local/www/data/的所有資料透過rsync放到伺服端的
/backup/ohaha/data/ 資料夾下.
指令: rsync -rvlHpogDtS --password-file=/usr/local/etc/rsyncd.secrets /usr/local/www/data/ ohaha@backup.mlc.edu.tw::ohaha

說明: rsync 指令
rvlHpogDtS 參數 (部分參數可以用-a取代)
--password-file=/usr/local/etc/rsyncd.secrets 所要讀取的密碼檔位置
/usr/local/www/data/ 要備份的資料來源
ohaha@backup.mlc.edu.tw::ohaha 透過ohaha這個帳號,連結rsync伺服端(backup)的[ohaha]設定值.

◎檔案:
設定檔: /usr/local/etc/rsyncd.conf 或 rsyncd.conf

2009年5月20日 星期三

linux安裝程式的指令(apt-get、yum)

早期是用rpm
但後來fc,suse,centos,ubuntu都有發展出內建的一套介面程式
目前我有用過的就這幾套
大致上是
yum -->fc,centos,suse
yast -->suse
apt-get -->ubuntu(debian)
(當然..你想在ubuntu上使用yum或是centos上使用apt-get也是可以啦,自己裝一裝就是了)

安裝指令
yum install 套件名稱
apt-get install 套件名稱

搜尋指令
yum provides 關鍵字
apt-cache search 關鍵字


基本上..大概就這二個比較常用,其他像update,remove等參數都是同樣的用法

但在fc6上,我有遇到一個問題..就是用yum install 會無法安裝
它會顯示找不到檔案(那是因為fc6以後,它預設的更新站台己轉移)
要解決這個問題,需要去修改/etc/yum.repos.d/這個目錄下的幾個.repo檔
例如:fedora-core.repo這個檔案
修改原本的
#baseurl=http://download.fedora.redhat.com/pub/fedora/linux/core/$releasever/$basearch/os/

改成
baseurl=http://archives.fedoraproject.org/pub/archive/fedora/linux/core/$releasever/$basearch/os/


fc6的/etc/yum.repos.d/這個目錄下...預設有

fedora-core.repo fedora-legacy.repo
fedora-development.repo fedora-updates.repo
fedora-extras-development.repo fedora-updates-testing.repo
fedora-extras.repo

這幾個檔...原則上每個都要參照原本的路徑去修正
不然就會遇到類似
Error: Cannot find a valid baseurl for repo: extras
這樣的錯誤訊息 ----> 看最後是什麼關鍵字..就去改 fedora-xxxx.repo

這裡要說的是,suse預設是沒有這東西的,即使裝好yum,它的/etc/yum.repos.d/下仍然是空的
得自己新增一個abc.repo的檔案在該目錄下,如下範例

[base]
name=SUSE LINUX 10.0 - Base
#baseurl=ftp://ftp.gwdg.de/pub/opensuse/distribution/SL-10.0-OSS/inst-source/suse
mirrorlist=/etc/yum.repos.d/base.mirrors
enabled=1
gpgcheck=1
gpgkey=ftp://ftp.gwdg.de/pub/opensuse/distribution/SL-10.0-OSS/inst-source/pubring.gpg

相關的詳細資料,請參閱http://liquidat.wordpress.com/2005/10/16/setting-up-yum-on-suse-linux-100-3/


最後摘錄一些從 yum apt 常用指令索引看來的資料

APT 常用指令如下:

apt-get update
更新套件列表

apt-get dist-upgrade
升級 rpm

apt-cache search
搜尋套件,ex: apt-cache search httpd

apt-get install
安裝套件,這裡的套件安裝,會考慮到相依性的問題。 ex: apt-get install httpd

apt-get remove
移除套件,這裡的套件移除,也會考慮到相依性的問題。 ex: apt-get remove httpd

apt-get clean
清除安裝時下載的暫存套件原始檔案,位於 /var/cache/apt/archives

YUM 常用指令如下:

yum update
更新套件, ex: yum update httpd,如果只有 yum update ,會更新所有已經安裝的套件。

yum search
搜尋套件,ex: yum search httpd*,會搜尋所有跟 httpd 有關的套件。

yum install
安裝套件,這裡的套件安裝,會考慮到相依性的問題。 ex: yum install httpd

yum remove
移除套件,這裡的套件移除,也會考慮到相依性的問題。 ex: yum remove httpd

yum clean
清除安裝時下載的暫存套件原始檔案,位於 /var/cache/yum,因為這裡可以清除的項目很多,我最常用的是 yum clean all ,一次給他清掉 :p

yum list
列出套件名稱,用法常用有分以下幾種:

yum list updates
列出所有可以更新的套件

yum list installed
列出所有已安裝的套件

更多的中文參考資訊,可以見以下兩個網站:
YUM的使用
APT 的安裝、使用
早期是用rpm
但後來fc,suse,centos,ubuntu都有發展出內建的一套介面程式
目前我有用過的就這幾套
大致上是
yum -->fc,centos,suse
yast -->suse
apt-get -->ubuntu(debian)
(當然..你想在ubuntu上使用yum或是centos上使用apt-get也是可以啦,自己裝一裝就是了)

安裝指令
yum install 套件名稱
apt-get install 套件名稱

搜尋指令
yum provides 關鍵字
apt-cache search 關鍵字


基本上..大概就這二個比較常用,其他像update,remove等參數都是同樣的用法

但在fc6上,我有遇到一個問題..就是用yum install 會無法安裝
它會顯示找不到檔案(那是因為fc6以後,它預設的更新站台己轉移)
要解決這個問題,需要去修改/etc/yum.repos.d/這個目錄下的幾個.repo檔
例如:fedora-core.repo這個檔案
修改原本的
#baseurl=http://download.fedora.redhat.com/pub/fedora/linux/core/$releasever/$basearch/os/

改成
baseurl=http://archives.fedoraproject.org/pub/archive/fedora/linux/core/$releasever/$basearch/os/


fc6的/etc/yum.repos.d/這個目錄下...預設有

fedora-core.repo fedora-legacy.repo
fedora-development.repo fedora-updates.repo
fedora-extras-development.repo fedora-updates-testing.repo
fedora-extras.repo

這幾個檔...原則上每個都要參照原本的路徑去修正
不然就會遇到類似
Error: Cannot find a valid baseurl for repo: extras
這樣的錯誤訊息 ----> 看最後是什麼關鍵字..就去改 fedora-xxxx.repo

這裡要說的是,suse預設是沒有這東西的,即使裝好yum,它的/etc/yum.repos.d/下仍然是空的
得自己新增一個abc.repo的檔案在該目錄下,如下範例

[base]
name=SUSE LINUX 10.0 - Base
#baseurl=ftp://ftp.gwdg.de/pub/opensuse/distribution/SL-10.0-OSS/inst-source/suse
mirrorlist=/etc/yum.repos.d/base.mirrors
enabled=1
gpgcheck=1
gpgkey=ftp://ftp.gwdg.de/pub/opensuse/distribution/SL-10.0-OSS/inst-source/pubring.gpg

相關的詳細資料,請參閱http://liquidat.wordpress.com/2005/10/16/setting-up-yum-on-suse-linux-100-3/


最後摘錄一些從 yum apt 常用指令索引看來的資料

APT 常用指令如下:

apt-get update
更新套件列表

apt-get dist-upgrade
升級 rpm

apt-cache search
搜尋套件,ex: apt-cache search httpd

apt-get install
安裝套件,這裡的套件安裝,會考慮到相依性的問題。 ex: apt-get install httpd

apt-get remove
移除套件,這裡的套件移除,也會考慮到相依性的問題。 ex: apt-get remove httpd

apt-get clean
清除安裝時下載的暫存套件原始檔案,位於 /var/cache/apt/archives

YUM 常用指令如下:

yum update
更新套件, ex: yum update httpd,如果只有 yum update ,會更新所有已經安裝的套件。

yum search
搜尋套件,ex: yum search httpd*,會搜尋所有跟 httpd 有關的套件。

yum install
安裝套件,這裡的套件安裝,會考慮到相依性的問題。 ex: yum install httpd

yum remove
移除套件,這裡的套件移除,也會考慮到相依性的問題。 ex: yum remove httpd

yum clean
清除安裝時下載的暫存套件原始檔案,位於 /var/cache/yum,因為這裡可以清除的項目很多,我最常用的是 yum clean all ,一次給他清掉 :p

yum list
列出套件名稱,用法常用有分以下幾種:

yum list updates
列出所有可以更新的套件

yum list installed
列出所有已安裝的套件

更多的中文參考資訊,可以見以下兩個網站:
YUM的使用
APT 的安裝、使用

apache 的 rewrite

本篇文章節錄自Apache 重寫規則的常見應用 (rewrite)

主要記錄一下怎麼針對 *.host.com 去做 rewrite的動作


若今天要轉換www.username.domain.com的請求
到www.domain.com/username

對HTTP/1.1的請求包括一個Host: HTTP頭,我們能用下面的規則集重寫
http://www.username.domain.com/anypath 到 /home/username/anypath

Rewriteengine on
rewritecond %{HTTP_HOST} ^www\.[^.]+\.host\.com$
rewriterule ^(.+) %{HTTP_HOST}$1 [C]
rewriterule ^www\.([^.]+)\.host\.com(.*) /home/$1$2

這裡的 $1 $2 基本上就是對應前面的 ( ) 內的東西
例:$1 = username , $2 = /anypath

注:
rewritecond 條件重寫規則,當滿足上面定義的條件才會應用下面的重寫規則,
rewritecond 另有各種變量,請查閱相關文檔。

另外,可以開啟rewrite的log記錄來看一下是不是轉到莫名其妙的地方去了
可以查看:
http://w.yi.org/ftp/FAPM/apache/Apache2/zh/mod/mod_rewrite.html#rewriteloglevel
或直接加入下面二行

RewriteLog "/var/log/httpd/rewrite.log"
RewriteLogLevel 3


注意:
RewriteLogLevel指令設置重寫引擎日誌的詳細程度的級別。 默認級別0意味著不記錄,而9或更大的值意味著記錄所有的操作。

要關閉重寫引擎日誌,可以簡單地設此值為0,關閉所有的重寫操作記錄。

使用較高的Level值會使Apache服務器速度急劇下降! 重寫日誌使用大於2的Level值只用於調試!

本篇文章節錄自Apache 重寫規則的常見應用 (rewrite)

主要記錄一下怎麼針對 *.host.com 去做 rewrite的動作


若今天要轉換www.username.domain.com的請求
到www.domain.com/username

對HTTP/1.1的請求包括一個Host: HTTP頭,我們能用下面的規則集重寫
http://www.username.domain.com/anypath 到 /home/username/anypath

Rewriteengine on
rewritecond %{HTTP_HOST} ^www\.[^.]+\.host\.com$
rewriterule ^(.+) %{HTTP_HOST}$1 [C]
rewriterule ^www\.([^.]+)\.host\.com(.*) /home/$1$2

這裡的 $1 $2 基本上就是對應前面的 ( ) 內的東西
例:$1 = username , $2 = /anypath

注:
rewritecond 條件重寫規則,當滿足上面定義的條件才會應用下面的重寫規則,
rewritecond 另有各種變量,請查閱相關文檔。

另外,可以開啟rewrite的log記錄來看一下是不是轉到莫名其妙的地方去了
可以查看:
http://w.yi.org/ftp/FAPM/apache/Apache2/zh/mod/mod_rewrite.html#rewriteloglevel
或直接加入下面二行

RewriteLog "/var/log/httpd/rewrite.log"
RewriteLogLevel 3


注意:
RewriteLogLevel指令設置重寫引擎日誌的詳細程度的級別。 默認級別0意味著不記錄,而9或更大的值意味著記錄所有的操作。

要關閉重寫引擎日誌,可以簡單地設此值為0,關閉所有的重寫操作記錄。

使用較高的Level值會使Apache服務器速度急劇下降! 重寫日誌使用大於2的Level值只用於調試!

2009年5月18日 星期一

新增swap的大小

主機因故把swap都吃光了...
但又無法有效釋放....只好手動幫它增swap了
下述內容是從 2.2. 增加 Swap 空間 摘錄,若需要詳細內容
請自行前往
http://www.aliok.net/study/linux/rhl-cg-zh_TW-9/index.html
這邊閱讀

由於主機上己無空閒的磁區可供分割出新的swap分割區
於是就利用新增swap檔案的方式來增加swap空間

新增一個 swap 檔案:

請先決定新 swap 檔案的大小,然後乘以 1024 以取得磁碟區塊(block)的大小,例如 64MB 之 swap 檔案的區塊大小為 65536。

請以 root 身份在 shell 提示符號下輸入下列指令,並包括 count 等於區塊大小的數值:

dd if=/dev/zero of=/swapfile bs=1024 count=65536


並使用以下指令來設定 swap 檔案:

mkswap /swapfile


如要立即啟用 swap 檔案(非開機時自動啟動),請使用下列指令:

swapon /swapfile


如要在開機時啟動它,請編輯 /etc/fstab 以包含:

/swapfile swap swap defaults 0 0


下次系統開機時,它將會啟用新的 swap 檔案。

在增加新的 swap 檔案並啟用它後,請檢視 cat /proc/swaps 或 free 指令的輸出以確定它已經被啟用。

主機因故把swap都吃光了...
但又無法有效釋放....只好手動幫它增swap了
下述內容是從 2.2. 增加 Swap 空間 摘錄,若需要詳細內容
請自行前往
http://www.aliok.net/study/linux/rhl-cg-zh_TW-9/index.html
這邊閱讀

由於主機上己無空閒的磁區可供分割出新的swap分割區
於是就利用新增swap檔案的方式來增加swap空間

新增一個 swap 檔案:

請先決定新 swap 檔案的大小,然後乘以 1024 以取得磁碟區塊(block)的大小,例如 64MB 之 swap 檔案的區塊大小為 65536。

請以 root 身份在 shell 提示符號下輸入下列指令,並包括 count 等於區塊大小的數值:

dd if=/dev/zero of=/swapfile bs=1024 count=65536


並使用以下指令來設定 swap 檔案:

mkswap /swapfile


如要立即啟用 swap 檔案(非開機時自動啟動),請使用下列指令:

swapon /swapfile


如要在開機時啟動它,請編輯 /etc/fstab 以包含:

/swapfile swap swap defaults 0 0


下次系統開機時,它將會啟用新的 swap 檔案。

在增加新的 swap 檔案並啟用它後,請檢視 cat /proc/swaps 或 free 指令的輸出以確定它已經被啟用。

2009年5月5日 星期二

pure-ftpd + mysql + web_manage

之前己經建置過了,但沒仔細記錄
這次就好好的記錄起來吧~~
參考了很多地方...但總是有缺了一些狀況的說明...
首先先去下載二個檔案
1.pure-ftpd-1.0.22.tar.gz
2.pure-ftpd_user_manage-2.1.tar.tgz

然後就是一連串的安裝過程了...


首先安裝 pure-ftpd-1.0.22.tar.gz
解開後,到目錄下執行
./configure \
--prefix=/usr/local/pureftpd \
--with-mysql \
--with-paranoidmsg \
--with-shadow \
--with-welcomemsg \
--with-uploadscript \
--with-quotas \
--with-cookie \
--with-virtualhosts \
--with-virtualchroot \
--with-diraliases \
--with-sysquotas \
--with-ratios \
--with-ftpwho \
--with-throttling

#make
#make install
#cd configuration-file
#chmod u+x pure-config.pl
#cp pure-config.pl /usr/local/pureftpd/sbin/
#cp pure-ftpd.conf /etc/pureftpd/

到這裡算是做好pure-ftpd的準備工作
======================================================================
若遇到
configure: error: libmysqlclient is needed for MySQL support

則先安裝mysql-devel,即可解決這問題
(yum install mysql-devel)
以及
將/usr/lib64/mysql/内的libmysqlclient.so.15.0.0做個軟連結到/usr/lib下即可
PHP預設是去的 /usr/lib/搜尋的,所以會找不到

上面的資訊來自: E点废墟(www.xok.la) 详细出处参考:http://xok.la/2008/08/configure_error_cannot_find_libmysqlclient_under.html

======================================================================
接下來安裝 pure-ftpd_user_manage-2.1.tar.tgz
解開它
tar -xvzf pure-ftpd_user_manage-2.1.tar.tgz
然後從網頁去做設定
http://xxxxxxx/pure-ftpd_user_manage/install.php
照著它的步驟一步一步設定好

然後將它最後產生的pureftpd-mysql設定檔複製起來
將它存到 /etc/pureftpd/pureftpd-mysql.conf
(記得將install.php刪除)
接下來修改
/etc/pureftpd/pure-ftpd.conf

# MySQL configuration file (see README.MySQL)
MySQLConfigFile /etc/pureftpd/pureftpd-mysql.conf

# Minimum UID for an authenticated user to log in.
MinUID 100
------->這個要注意一下,利用mysql設定帳號時,選登入的身份時
所選的UID記得要比這個數字高才可以登入

======================================================================
然後...就是執行程式了
依照剛才拷貝的pure-config.pl以及pure-ftpd.conf的路徑
/usr/local/pureftpd/sbin/pure-config.pl /etc/pureftpd/pure-ftpd.conf
這樣即可順利開啟起來

之前己經建置過了,但沒仔細記錄
這次就好好的記錄起來吧~~
參考了很多地方...但總是有缺了一些狀況的說明...
首先先去下載二個檔案
1.pure-ftpd-1.0.22.tar.gz
2.pure-ftpd_user_manage-2.1.tar.tgz

然後就是一連串的安裝過程了...


首先安裝 pure-ftpd-1.0.22.tar.gz
解開後,到目錄下執行
./configure \
--prefix=/usr/local/pureftpd \
--with-mysql \
--with-paranoidmsg \
--with-shadow \
--with-welcomemsg \
--with-uploadscript \
--with-quotas \
--with-cookie \
--with-virtualhosts \
--with-virtualchroot \
--with-diraliases \
--with-sysquotas \
--with-ratios \
--with-ftpwho \
--with-throttling

#make
#make install
#cd configuration-file
#chmod u+x pure-config.pl
#cp pure-config.pl /usr/local/pureftpd/sbin/
#cp pure-ftpd.conf /etc/pureftpd/

到這裡算是做好pure-ftpd的準備工作
======================================================================
若遇到
configure: error: libmysqlclient is needed for MySQL support

則先安裝mysql-devel,即可解決這問題
(yum install mysql-devel)
以及
將/usr/lib64/mysql/内的libmysqlclient.so.15.0.0做個軟連結到/usr/lib下即可
PHP預設是去的 /usr/lib/搜尋的,所以會找不到

上面的資訊來自: E点废墟(www.xok.la) 详细出处参考:http://xok.la/2008/08/configure_error_cannot_find_libmysqlclient_under.html

======================================================================
接下來安裝 pure-ftpd_user_manage-2.1.tar.tgz
解開它
tar -xvzf pure-ftpd_user_manage-2.1.tar.tgz
然後從網頁去做設定
http://xxxxxxx/pure-ftpd_user_manage/install.php
照著它的步驟一步一步設定好

然後將它最後產生的pureftpd-mysql設定檔複製起來
將它存到 /etc/pureftpd/pureftpd-mysql.conf
(記得將install.php刪除)
接下來修改
/etc/pureftpd/pure-ftpd.conf

# MySQL configuration file (see README.MySQL)
MySQLConfigFile /etc/pureftpd/pureftpd-mysql.conf

# Minimum UID for an authenticated user to log in.
MinUID 100
------->這個要注意一下,利用mysql設定帳號時,選登入的身份時
所選的UID記得要比這個數字高才可以登入

======================================================================
然後...就是執行程式了
依照剛才拷貝的pure-config.pl以及pure-ftpd.conf的路徑
/usr/local/pureftpd/sbin/pure-config.pl /etc/pureftpd/pure-ftpd.conf
這樣即可順利開啟起來

2009年5月4日 星期一

建立Mass Virtual Hosting

前面記了一篇virtual host快速設定法
裡面有提到Mass Virtual Hosting的做法,但覺得不是很清楚
於是再去找了 Hayes’s Blog 所寫的 Mass Virtual Hosting
這一篇就真的很詳細了....把內容直接做個記錄
方便往後自己要設定時,有整理過的資料可以參考

以前要新增一個 Virtual Host, 都必須寫類似以下這幾行的code在設定檔裡,
然後重啟 apache, 這樣對於架設大量 vhost 的 server 也太辛苦了

< Virtualhost 111.123.231.220 >
ServerName www.i-bbs.tw
DocumentRoot /var/www/
< /Virtualhost >

趁著伺服器下線研究了好幾個方案, 最後選擇了用 rewrite 的方法加上一些修改..

Step1 : edit /usr/local/etc/apache22/httpd.conf ,
把 mod_rewrite.so 這個 module 打開 , 然後在最低部加上



RewriteLog /var/log/rewrite_log # 自訂 log 的 path
RewriteLogLevel 0 # level 一定要設 0, 不然噴出來的 log 會擠爆硬碟 :p
RewriteEngine on
RewriteMap lowercase int:tolower
RewriteMap vhost txt:/etc/vhost.map # vhost.map 的 path
RewriteCond %{REQUEST_URI} !^/icons/
RewriteCond ${lowercase:%{SERVER_NAME}} ^(.+)$
RewriteCond ${vhost:%1} ^(/.*)$
RewriteRule ^/(.*)$ %1/$1 [L]

Step2 : edit /etc/vhost.map

#domain doc’s path
i-bbs.tw /usr/local/www/apache22/data/
www.i-bbs.tw /usr/local/www/apache22/data/www.i-bbs.tw
hayes.i-bbs.tw /usr/local/www/apache22/data/hayes.i-bbs.tw
mysql.i-bbs.tw /usr/local/www/apache22/data/phpMyAdmin

這裡有一個要注意的地方
由於我們要讓apache去讀取系統預設的/var/www以外的地方
所以得把selinux關掉(selinux的說明)
詳細做法-How to Disable SELinux
簡單來說...就是修改/etc/selinux/config 然後重開機就可以了
前面記了一篇virtual host快速設定法
裡面有提到Mass Virtual Hosting的做法,但覺得不是很清楚
於是再去找了 Hayes’s Blog 所寫的 Mass Virtual Hosting
這一篇就真的很詳細了....把內容直接做個記錄
方便往後自己要設定時,有整理過的資料可以參考

以前要新增一個 Virtual Host, 都必須寫類似以下這幾行的code在設定檔裡,
然後重啟 apache, 這樣對於架設大量 vhost 的 server 也太辛苦了

< Virtualhost 111.123.231.220 >
ServerName www.i-bbs.tw
DocumentRoot /var/www/
< /Virtualhost >

趁著伺服器下線研究了好幾個方案, 最後選擇了用 rewrite 的方法加上一些修改..

Step1 : edit /usr/local/etc/apache22/httpd.conf ,
把 mod_rewrite.so 這個 module 打開 , 然後在最低部加上



RewriteLog /var/log/rewrite_log # 自訂 log 的 path
RewriteLogLevel 0 # level 一定要設 0, 不然噴出來的 log 會擠爆硬碟 :p
RewriteEngine on
RewriteMap lowercase int:tolower
RewriteMap vhost txt:/etc/vhost.map # vhost.map 的 path
RewriteCond %{REQUEST_URI} !^/icons/
RewriteCond ${lowercase:%{SERVER_NAME}} ^(.+)$
RewriteCond ${vhost:%1} ^(/.*)$
RewriteRule ^/(.*)$ %1/$1 [L]

Step2 : edit /etc/vhost.map

#domain doc’s path
i-bbs.tw /usr/local/www/apache22/data/
www.i-bbs.tw /usr/local/www/apache22/data/www.i-bbs.tw
hayes.i-bbs.tw /usr/local/www/apache22/data/hayes.i-bbs.tw
mysql.i-bbs.tw /usr/local/www/apache22/data/phpMyAdmin

這裡有一個要注意的地方
由於我們要讓apache去讀取系統預設的/var/www以外的地方
所以得把selinux關掉(selinux的說明)
詳細做法-How to Disable SELinux
簡單來說...就是修改/etc/selinux/config 然後重開機就可以了

2009年3月2日 星期一

php的serialize與unserialize

今天遇到一個小問題...
用serialize記下來的資料,在用unserialize轉回原本的型態時..
若有遇到 " (雙引號[double question mark]) 會無法解析回原本的php變數型態

可以在使用serialized轉換前,用 htmlspecialchars()urlencode() 來解決這個問題
但較好的方式是用htmlspecialchars(),這樣的好處是不用再用urldecode()來把它轉換回正常的文字
==========================================================

2010.01.11更新
由於要顯示在textbox裡,用上述方法還是會有漏洞
試了很久,下面這順序應該是比較理想
1.寫入資料庫時,只做urlencode(若要使用addslashes,則在這之前)
  例:$a=urlencode(addslashes($text));
2.前端顯示時,則先解開,然後將slashes去掉,再用htmlspecialchars
  例:$a=htmlspecialchars(stripslashes(urldecode($dbValue)));


稍微記載一下這二者的說明


serialize --- 產生一個可儲存的值的表示
語法 : string serialize (mixed value)
說明 :
serialize( )傳回一個包含由value所表示的byte-stream字串,它能儲存在任何地方。
這可用來儲存或傳遞PHP的值,而不失去它們的型態和結構。
使用unserialize( )能使serialized字串再次成為原來PHP的值。
serialize( )能處理的型態有integer、double、string、array(多面的)、object(物件的屬性將會serialized,但方法則會lose)

unserialize --- 從儲存的值中建立PHP的值
語法 : mixed unserialize (string str)
說明 :
unserialize( )取一個serialized變數,並且將它轉換回PHP的值,傳回轉換後的值,
可以是integer、double、string、array、object。
如果物件有serialized,則它的方法不會保存在所傳回的值之中。


今天遇到一個小問題...
用serialize記下來的資料,在用unserialize轉回原本的型態時..
若有遇到 " (雙引號[double question mark]) 會無法解析回原本的php變數型態

可以在使用serialized轉換前,用 htmlspecialchars()urlencode() 來解決這個問題
但較好的方式是用htmlspecialchars(),這樣的好處是不用再用urldecode()來把它轉換回正常的文字
==========================================================

2010.01.11更新
由於要顯示在textbox裡,用上述方法還是會有漏洞
試了很久,下面這順序應該是比較理想
1.寫入資料庫時,只做urlencode(若要使用addslashes,則在這之前)
  例:$a=urlencode(addslashes($text));
2.前端顯示時,則先解開,然後將slashes去掉,再用htmlspecialchars
  例:$a=htmlspecialchars(stripslashes(urldecode($dbValue)));


稍微記載一下這二者的說明


serialize --- 產生一個可儲存的值的表示
語法 : string serialize (mixed value)
說明 :
serialize( )傳回一個包含由value所表示的byte-stream字串,它能儲存在任何地方。
這可用來儲存或傳遞PHP的值,而不失去它們的型態和結構。
使用unserialize( )能使serialized字串再次成為原來PHP的值。
serialize( )能處理的型態有integer、double、string、array(多面的)、object(物件的屬性將會serialized,但方法則會lose)

unserialize --- 從儲存的值中建立PHP的值
語法 : mixed unserialize (string str)
說明 :
unserialize( )取一個serialized變數,並且將它轉換回PHP的值,傳回轉換後的值,
可以是integer、double、string、array、object。
如果物件有serialized,則它的方法不會保存在所傳回的值之中。


2009年2月20日 星期五

rsync的文章

公司的主機資料同步都是用rsync來做的
rsync 也有支援 SSH,也就是加密傳輸。
目前主機上就都是這樣在做的,但這些都是前人做好的

一直沒花時間去弄懂它..
直到前一陣子為了弄unix -> windows的資料同步
才把它稍微搞懂了一下

以下記錄網路上二篇文章的連結以及安裝過程跟所遇到的問題


介紹一下 rsync 這個同步備份程式
這一篇主要教了以下幾種方式的同步
unix -> unix
unix -> windows
windows -> unix
windows -> windows


然後....
Rsync + SSH — 讓 Server 自動異地備援也加密
這一篇就是講到怎麼讓rsync透過ssh來同步


下面記錄一下我的安裝過程

1.安裝cwrsync server(連結)

2.安裝完成後,在windows的服務裡,啟動 Openssh SSHD 和 RsyncServer 這兩個服務
註:若遇到無法啟動RsyncServer時,請先去C:\Program Files\cwRsyncServe下,把rsyncd.pid刪除,再啟動

3.把C:\Program Files\cwRsyncServer\var\SvcwRsync\.ssh\cwrsync 這個檔案丟到unix主機上
要執行rsync to windows.sh這個程式的user目錄下的.ssh裡面,權限設成600

4.設定windows上的rsync.conf以及要在unix上執行的shell script檔
註:這邊是利用在柚可椰小站所分享的shell script來做
要改的是restore to windows.sh中的
# identity: private key file for cwRsyncServer service account (available from Start Menu)
identity='/.ssh/cwrsync'

# which ps? /usr/ucb/ps for Solaris and /bin/ps for others
PS=/usr/ucb/ps

這二行,依自己的需求更改即可(修改cwrsync放的位置,以及ps這個程式所在的位置)
然後rsync.conf則是在C:\Program Files\cwRsyncServer\下
例:
[backupWeb]
path = /cygdrive/f/e-rent/web
read only = false
transfer logging = yes

節錄文章中二段比較需要注意的地方,script的用法,以及rsync.conf的設定說明以及使用restore to windows.sh的語法注意事項

cwRsync 的網站上介紹了一個 shell script 。我把那個 shell script 稍微改寫一下,改成 backup_from_windows.shrestore_to_windows.sh

backup_from_windows.sh 的用途是 windows -> unix,用法是
backup_from_windows.sh <windows_ip><windows_module><unix_directory>

restore_to_windows.sh 的用途是 unix -> windows,用法是
restore_to_windows.sh <windows_ip><unix_directory><windows_module>


另外要特別提一點,在 windows 的 rsyncd.conf 裡的一個標準的 module 寫法是像這樣

[test1]
path = /cygdrive/d/16
read only = false
transfer logging = yes


這個 module 的名稱是 test1 ,所定義的目錄是 D:\16,read only 是 false,所以除了備份之外也可以回存。所以想要在 unix 上把 windows 上的 D:\16 備份到 /work/16,就會下像這樣的指令,

backup_from_windows.sh 10.0.0.50 test1 /work/16

這樣 D:\16 下的所有目錄和檔案就會全部備份到 /work/16 去了。

但是,如果要把 /work/16 回存到 D:\16 的話,請記得要用 /work/16/ 而不是 /work/16,也就是說指令要這樣下,

restore_to_windows.sh 10.0.0.50 /work/16/ test1

如果不用 /work/16/ 而用 /work/16 的話,在 windows 裡的 D:\16 裡就會多一個目錄 D:\16\16,這就不是我們所期待的結果了。

這個部份的語法問題,在另一篇文章裡有說明到


上面用到的檔案若無法連結,我有自己上傳一份備用的
cwRsyncServer
back from windows.sh
restore to windows.sh
公司的主機資料同步都是用rsync來做的
rsync 也有支援 SSH,也就是加密傳輸。
目前主機上就都是這樣在做的,但這些都是前人做好的

一直沒花時間去弄懂它..
直到前一陣子為了弄unix -> windows的資料同步
才把它稍微搞懂了一下

以下記錄網路上二篇文章的連結以及安裝過程跟所遇到的問題


介紹一下 rsync 這個同步備份程式
這一篇主要教了以下幾種方式的同步
unix -> unix
unix -> windows
windows -> unix
windows -> windows


然後....
Rsync + SSH — 讓 Server 自動異地備援也加密
這一篇就是講到怎麼讓rsync透過ssh來同步


下面記錄一下我的安裝過程

1.安裝cwrsync server(連結)

2.安裝完成後,在windows的服務裡,啟動 Openssh SSHD 和 RsyncServer 這兩個服務
註:若遇到無法啟動RsyncServer時,請先去C:\Program Files\cwRsyncServe下,把rsyncd.pid刪除,再啟動

3.把C:\Program Files\cwRsyncServer\var\SvcwRsync\.ssh\cwrsync 這個檔案丟到unix主機上
要執行rsync to windows.sh這個程式的user目錄下的.ssh裡面,權限設成600

4.設定windows上的rsync.conf以及要在unix上執行的shell script檔
註:這邊是利用在柚可椰小站所分享的shell script來做
要改的是restore to windows.sh中的
# identity: private key file for cwRsyncServer service account (available from Start Menu)
identity='/.ssh/cwrsync'

# which ps? /usr/ucb/ps for Solaris and /bin/ps for others
PS=/usr/ucb/ps

這二行,依自己的需求更改即可(修改cwrsync放的位置,以及ps這個程式所在的位置)
然後rsync.conf則是在C:\Program Files\cwRsyncServer\下
例:
[backupWeb]
path = /cygdrive/f/e-rent/web
read only = false
transfer logging = yes

節錄文章中二段比較需要注意的地方,script的用法,以及rsync.conf的設定說明以及使用restore to windows.sh的語法注意事項

cwRsync 的網站上介紹了一個 shell script 。我把那個 shell script 稍微改寫一下,改成 backup_from_windows.shrestore_to_windows.sh

backup_from_windows.sh 的用途是 windows -> unix,用法是
backup_from_windows.sh <windows_ip><windows_module><unix_directory>

restore_to_windows.sh 的用途是 unix -> windows,用法是
restore_to_windows.sh <windows_ip><unix_directory><windows_module>


另外要特別提一點,在 windows 的 rsyncd.conf 裡的一個標準的 module 寫法是像這樣

[test1]
path = /cygdrive/d/16
read only = false
transfer logging = yes


這個 module 的名稱是 test1 ,所定義的目錄是 D:\16,read only 是 false,所以除了備份之外也可以回存。所以想要在 unix 上把 windows 上的 D:\16 備份到 /work/16,就會下像這樣的指令,

backup_from_windows.sh 10.0.0.50 test1 /work/16

這樣 D:\16 下的所有目錄和檔案就會全部備份到 /work/16 去了。

但是,如果要把 /work/16 回存到 D:\16 的話,請記得要用 /work/16/ 而不是 /work/16,也就是說指令要這樣下,

restore_to_windows.sh 10.0.0.50 /work/16/ test1

如果不用 /work/16/ 而用 /work/16 的話,在 windows 裡的 D:\16 裡就會多一個目錄 D:\16\16,這就不是我們所期待的結果了。

這個部份的語法問題,在另一篇文章裡有說明到


上面用到的檔案若無法連結,我有自己上傳一份備用的
cwRsyncServer
back from windows.sh
restore to windows.sh

[Ubuntu]關於update-rc.d 用法

如果在 /etc/init.d 中加入一個 script,還須要製作相關的 link
存到 /etc/rc*.d 中。
K 開頭是 kill , S 開頭是 start , 數字順序代表啟動的順序。
這些動作都可以利用update-rc.d來完成。


例:
在 /etc/init.d 中建立一個叫作 zope 的 script , 然後

update-rc.d zope defaults

就會產生以下連結::

Adding system startup for /etc/init.d/zope ...
/etc/rc0.d/K20zope -> ../init.d/zope
/etc/rc1.d/K20zope -> ../init.d/zope
/etc/rc6.d/K20zope -> ../init.d/zope
/etc/rc2.d/S20zope -> ../init.d/zope
/etc/rc3.d/S20zope -> ../init.d/zope
/etc/rc4.d/S20zope -> ../init.d/zope
/etc/rc5.d/S20zope -> ../init.d/zope

其他進階使用方式請 man update-rc.d

延伸閱讀: Debian和RH的差異這一篇內容是在講下述內容
<使用Debian工具進行工作>
RH包含了一些用於自動管理SysV初始腳本過程的工具,也就是chkconfig民service。
Debian並包含這些工具,但是卻提供相似的管理工具:update-rc.d與invoke-rc.d。

如果在 /etc/init.d 中加入一個 script,還須要製作相關的 link
存到 /etc/rc*.d 中。
K 開頭是 kill , S 開頭是 start , 數字順序代表啟動的順序。
這些動作都可以利用update-rc.d來完成。


例:
在 /etc/init.d 中建立一個叫作 zope 的 script , 然後

update-rc.d zope defaults

就會產生以下連結::

Adding system startup for /etc/init.d/zope ...
/etc/rc0.d/K20zope -> ../init.d/zope
/etc/rc1.d/K20zope -> ../init.d/zope
/etc/rc6.d/K20zope -> ../init.d/zope
/etc/rc2.d/S20zope -> ../init.d/zope
/etc/rc3.d/S20zope -> ../init.d/zope
/etc/rc4.d/S20zope -> ../init.d/zope
/etc/rc5.d/S20zope -> ../init.d/zope

其他進階使用方式請 man update-rc.d

延伸閱讀: Debian和RH的差異這一篇內容是在講下述內容
<使用Debian工具進行工作>
RH包含了一些用於自動管理SysV初始腳本過程的工具,也就是chkconfig民service。
Debian並包含這些工具,但是卻提供相似的管理工具:update-rc.d與invoke-rc.d。

2009年2月5日 星期四

Apache 防止 Dos 攻擊套件

Denial of Service 可以稱為 “阻絕服務攻擊”。這個名稱也經常聽見,在很多地方都發生。
其實 Denial of Service 所傳送的請求和正常的是一樣,只是每分鐘傳送數以十計以上請求傳送至伺服器中。令伺服器每秒處理十分大量的工作。

受到這一種攻擊,輕則只有伺服器暫時停止服務。重則會把伺服器中的硬體破壞。有不少例子都是由於伺服器在同一時間處理十分大量的工作後,CPU 最後壞了。最近公司的其中一個網站受到這些不明來歷的 Denial of Service 攻擊,伺服器一直當機。
搜尋了不少網站,終於找到了一個方法。不過不知道是否可行的。所使用的是 mod_dosevasive。
雖然是第一次用,不過是否真的能夠防止就必須等到下一次受到攻擊使知道。
(雖然一裝好就有阻斷了很多IP,但是不是真的從此相安無事,就得等時間來驗證了)


1.首次下載 mod_dosevasive 1.1 版本。

2.然後解壓 mod_dosevasive_1.10.tar.gz

tar zxvf mod_dosevasive_1.10.tar.gz


3.把您的 httpd.conf 備份

4.開始安裝mod_dosevasive

Apache 1.3.x:
cd mod_dosevasive
apxs -cia mod_dosevasive.c


Apache 2.0.x:
cd mod_dosevasive
apxs -cia mod_dosevasive20.c


註:若沒安裝apxs,可執行yum provides <some_file_name>去搜尋需要的套件
例如:yum provides spxs

在這裡,要安裝的指令是yum install httpd-devel


5.修改您的 httpd.conf 加入
Apache 1.3.x:


DOSHashTableSize 3097
DOSPageCount 5
DOSSiteCount 100
DOSPageInterval 2
DOSSiteInterval 2
DOSBlockingPeriod 600


Apache 2.0.x:


DOSHashTableSize 3097
DOSPageCount 5
DOSSiteCount 100
DOSPageInterval 2
DOSSiteInterval 2
DOSBlockingPeriod 10
DOSBlockingPeriod 600



最後是在httpd.conf 當中的設定參數解釋:

DOSHashTableSize
 這是佔中您記憶體的大小。當數目越大處理越快,當您的伺服器是很多人流的,您必須加大這個數字。
DOSPageCount
 同一頁同一人時能夠在同一個時段中最多可請求幾次,超過會禁止。時段可以在 DOSPageInterval 中設定。
DOSSiteCount
 同一個網站同一人在伺服器中最多可佔有幾個 Object,超過會禁止。時段可以在 DOSSiteInterval 中設定。
DOSPageInterval
 DOSPageCount 中所計算的每一個時間區段,以秒計算。預設是 1 秒。
DOSSiteInterval
 DOSSiteCount 中所計算的每一個時間區段,以秒計算。預設是 1 秒。
DOSBlockingPeriod
 當發現疑似攻擊後暫停多久?預設是 10 秒。當發現後,使用者會接收到 403 (Forbidden) 的訊息。

以下三個參數要放在IfModule外面

DOSEmailNotify
設定接收攻擊信息的電郵地址。
例:DOSEmailNotify you@yourdomain.com

DOSSystemCommand
這是收到攻擊信息時所使用的指令。
例:DOSSystemCommand ”su - someuser -c \’/sbin/… %s …\’”
  /bin/mail -t %s (%s指的是DOSEmailNotify設定的email address)

DOSLogDir
記錄檔案設定。
例:DOSLogDir ”/var/lock/mod_dosevasive”

Denial of Service 可以稱為 “阻絕服務攻擊”。這個名稱也經常聽見,在很多地方都發生。
其實 Denial of Service 所傳送的請求和正常的是一樣,只是每分鐘傳送數以十計以上請求傳送至伺服器中。令伺服器每秒處理十分大量的工作。

受到這一種攻擊,輕則只有伺服器暫時停止服務。重則會把伺服器中的硬體破壞。有不少例子都是由於伺服器在同一時間處理十分大量的工作後,CPU 最後壞了。最近公司的其中一個網站受到這些不明來歷的 Denial of Service 攻擊,伺服器一直當機。
搜尋了不少網站,終於找到了一個方法。不過不知道是否可行的。所使用的是 mod_dosevasive。
雖然是第一次用,不過是否真的能夠防止就必須等到下一次受到攻擊使知道。
(雖然一裝好就有阻斷了很多IP,但是不是真的從此相安無事,就得等時間來驗證了)


1.首次下載 mod_dosevasive 1.1 版本。

2.然後解壓 mod_dosevasive_1.10.tar.gz

tar zxvf mod_dosevasive_1.10.tar.gz


3.把您的 httpd.conf 備份

4.開始安裝mod_dosevasive

Apache 1.3.x:
cd mod_dosevasive
apxs -cia mod_dosevasive.c


Apache 2.0.x:
cd mod_dosevasive
apxs -cia mod_dosevasive20.c


註:若沒安裝apxs,可執行yum provides <some_file_name>去搜尋需要的套件
例如:yum provides spxs

在這裡,要安裝的指令是yum install httpd-devel


5.修改您的 httpd.conf 加入
Apache 1.3.x:


DOSHashTableSize 3097
DOSPageCount 5
DOSSiteCount 100
DOSPageInterval 2
DOSSiteInterval 2
DOSBlockingPeriod 600


Apache 2.0.x:


DOSHashTableSize 3097
DOSPageCount 5
DOSSiteCount 100
DOSPageInterval 2
DOSSiteInterval 2
DOSBlockingPeriod 10
DOSBlockingPeriod 600



最後是在httpd.conf 當中的設定參數解釋:

DOSHashTableSize
 這是佔中您記憶體的大小。當數目越大處理越快,當您的伺服器是很多人流的,您必須加大這個數字。
DOSPageCount
 同一頁同一人時能夠在同一個時段中最多可請求幾次,超過會禁止。時段可以在 DOSPageInterval 中設定。
DOSSiteCount
 同一個網站同一人在伺服器中最多可佔有幾個 Object,超過會禁止。時段可以在 DOSSiteInterval 中設定。
DOSPageInterval
 DOSPageCount 中所計算的每一個時間區段,以秒計算。預設是 1 秒。
DOSSiteInterval
 DOSSiteCount 中所計算的每一個時間區段,以秒計算。預設是 1 秒。
DOSBlockingPeriod
 當發現疑似攻擊後暫停多久?預設是 10 秒。當發現後,使用者會接收到 403 (Forbidden) 的訊息。

以下三個參數要放在IfModule外面

DOSEmailNotify
設定接收攻擊信息的電郵地址。
例:DOSEmailNotify you@yourdomain.com

DOSSystemCommand
這是收到攻擊信息時所使用的指令。
例:DOSSystemCommand ”su - someuser -c \’/sbin/… %s …\’”
  /bin/mail -t %s (%s指的是DOSEmailNotify設定的email address)

DOSLogDir
記錄檔案設定。
例:DOSLogDir ”/var/lock/mod_dosevasive”