2012年8月3日 星期五

MYSQL 重覆資料怎麼刪除

這次又遇到一樣的問題了,key沒處理好,造成會有重複的資料

搜尋了一下,有看到幾種做法
1.直接刪掉在talbe裡重複的資料
例:ALTER IGNORE TABLE `資料表名稱` ADD UNIQUE INDEX(`欄位1`,`欄位2`...);

2.分二次,將 重複的資料 以及 未重複的資料 分別匯入另一個表,然後直接取代舊表

 我採用了以下的方式(較安全,雖然慢了一點) 
1.先將"未重複"的資料寫到另一個表 INSERT INTO `table_copy` SELECT * FROM `table` GROUP BY `field name` HAVING count(*)=1 
2.再將"重複"的資料寫到另一個表 INSERT INTO `table_copy` SELECT * FROM `table` GROUP BY `field name` HAVING count(*)>1 
3.直接用新表取代舊的表 

參考資料來源 
1、從MYSQL資料庫中找出重複的資料並刪除
2、[MYSQL]利用 SQL 找出欄位值重覆的記錄
這次又遇到一樣的問題了,key沒處理好,造成會有重複的資料

搜尋了一下,有看到幾種做法
1.直接刪掉在talbe裡重複的資料
例:ALTER IGNORE TABLE `資料表名稱` ADD UNIQUE INDEX(`欄位1`,`欄位2`...);

2.分二次,將 重複的資料 以及 未重複的資料 分別匯入另一個表,然後直接取代舊表

 我採用了以下的方式(較安全,雖然慢了一點) 
1.先將"未重複"的資料寫到另一個表 INSERT INTO `table_copy` SELECT * FROM `table` GROUP BY `field name` HAVING count(*)=1 
2.再將"重複"的資料寫到另一個表 INSERT INTO `table_copy` SELECT * FROM `table` GROUP BY `field name` HAVING count(*)>1 
3.直接用新表取代舊的表 

參考資料來源 
1、從MYSQL資料庫中找出重複的資料並刪除
2、[MYSQL]利用 SQL 找出欄位值重覆的記錄

2011年5月6日 星期五

如何使用windows xp設定vpn server

原來xp可以直接架vpn server啊
(雖然還是有限制要XP PRO版的,但己經很方便了)


相關的作法在「WindowsXP VPN Server」裡有說明的非常詳細了,不過有幾個地方還是要注意一下

1.分配的IP要跟vpn所在的ip區段一樣,不然會無法透過該網路再連到外部
2.若是vpn server在AP的後面,則要開啟1723這個port跟protocol 47給對應的vpn server
由於只有用到pptp,所以只要開這二個,若是用其他vpn server,則需開啟其他相對應的port或protocol
(可參考VPN 伺服器與防火牆設定的說明)

設定步驟
一、 選擇網路連線
二、 建立新的連線
三、 進入新增連線精靈,進行下一步
四、 選擇設定一個進階的連線
五、 擇接受連入連線
六、 入連線接收裝置,直接跳到下一步,不需作任何設定
七、 擇允許私人連線
八、 選「內容」設定tcp/ip
九、 派tcp/ip的位址範圍(也可不設,由dhcp自己指派也行)
十、 後就是按下「完成」結束設定
十一、防火牆的部份,必須開啟port 1723、protocol 47給予對應vpn server所用的ip


原來xp可以直接架vpn server啊
(雖然還是有限制要XP PRO版的,但己經很方便了)


相關的作法在「WindowsXP VPN Server」裡有說明的非常詳細了,不過有幾個地方還是要注意一下

1.分配的IP要跟vpn所在的ip區段一樣,不然會無法透過該網路再連到外部
2.若是vpn server在AP的後面,則要開啟1723這個port跟protocol 47給對應的vpn server
由於只有用到pptp,所以只要開這二個,若是用其他vpn server,則需開啟其他相對應的port或protocol
(可參考VPN 伺服器與防火牆設定的說明)

設定步驟
一、 選擇網路連線
二、 建立新的連線
三、 進入新增連線精靈,進行下一步
四、 選擇設定一個進階的連線
五、 擇接受連入連線
六、 入連線接收裝置,直接跳到下一步,不需作任何設定
七、 擇允許私人連線
八、 選「內容」設定tcp/ip
九、 派tcp/ip的位址範圍(也可不設,由dhcp自己指派也行)
十、 後就是按下「完成」結束設定
十一、防火牆的部份,必須開啟port 1723、protocol 47給予對應vpn server所用的ip


2010年11月11日 星期四

利用netstat找出怪怪的連線

起因:
主機上偶爾有一個httpd的線程佔用大量記憶體,但一直不確定是那個網頁造成的
它會造成網路,暫時沒反應...>.<
努力找了很久都沒找到...(是我太笨嗎??)


後來先利用top來看出是那個httpd及其PID,
再利用netstat -ntup | grep ESTAB 來比對查詢是來自那一個ip
這樣就可以到httpd的log去查是那一個網頁

不過,查出來後竟然是因為mysql搜尋出來的資料量太大
它一直在收資料,整個頻寬都被它佔去了

所幸主機上還有另一張對內的網卡,於是把mysql的連線都轉而走那張對內的卡
這樣就解決這問題了
(這好像是早就應該要這麼做的事了....>.<)


以下是一些實用的 netstat 語法,可以檢查主機的連線數量:

netstat -na
顯示主機上所有已建立的連線。
netstat -an | grep :80 | sort
顯示所有 port 80 的連線,並把結果排序。
netstat -n -p|grep SYN_REC | wc -l
列出主機上有多少個 SYNC_REC,一般上這個數字應該相當低。
netstat -n -p | grep SYN_REC | sort -u
同樣是列出 SYNC_REC,但不只列出數字,而是將每個 SYNC_REC 的連線列出。
netstat -n -p | grep SYN_REC | awk '{print $5}' | awk -F: '{print $1}'
列出發送 SYNC_REC 的所有 ip 地址。
netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
計算每一個 ip 在主機上建立的連線數量。
netstat -anp |grep 'tcp\|udp' | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
列出從 TCP 或 UDP 連線到主機的 ip 的數量。
netstat -ntu | grep ESTAB | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr
列出每個 ip 建立的 ESTABLISHED 連線數量。
netstat -plan|grep :80|awk {'print $5'}|cut -d: -f 1|sort|uniq -c|sort -nk 1
列出每個 ip 建立的 port 80 連線數量。



參考資料:使用 netstat 找出不正常的連線
起因:
主機上偶爾有一個httpd的線程佔用大量記憶體,但一直不確定是那個網頁造成的
它會造成網路,暫時沒反應...>.<
努力找了很久都沒找到...(是我太笨嗎??)


後來先利用top來看出是那個httpd及其PID,
再利用netstat -ntup | grep ESTAB 來比對查詢是來自那一個ip
這樣就可以到httpd的log去查是那一個網頁

不過,查出來後竟然是因為mysql搜尋出來的資料量太大
它一直在收資料,整個頻寬都被它佔去了

所幸主機上還有另一張對內的網卡,於是把mysql的連線都轉而走那張對內的卡
這樣就解決這問題了
(這好像是早就應該要這麼做的事了....>.<)


以下是一些實用的 netstat 語法,可以檢查主機的連線數量:

netstat -na
顯示主機上所有已建立的連線。
netstat -an | grep :80 | sort
顯示所有 port 80 的連線,並把結果排序。
netstat -n -p|grep SYN_REC | wc -l
列出主機上有多少個 SYNC_REC,一般上這個數字應該相當低。
netstat -n -p | grep SYN_REC | sort -u
同樣是列出 SYNC_REC,但不只列出數字,而是將每個 SYNC_REC 的連線列出。
netstat -n -p | grep SYN_REC | awk '{print $5}' | awk -F: '{print $1}'
列出發送 SYNC_REC 的所有 ip 地址。
netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
計算每一個 ip 在主機上建立的連線數量。
netstat -anp |grep 'tcp\|udp' | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
列出從 TCP 或 UDP 連線到主機的 ip 的數量。
netstat -ntu | grep ESTAB | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr
列出每個 ip 建立的 ESTABLISHED 連線數量。
netstat -plan|grep :80|awk {'print $5'}|cut -d: -f 1|sort|uniq -c|sort -nk 1
列出每個 ip 建立的 port 80 連線數量。



參考資料:使用 netstat 找出不正常的連線

2010年9月14日 星期二

lsattr以及chattr的用法

前一陣子幫手上管理的網站換到別台主機
要去修改sshd登入時要用的key時..竟然不能修改..
我己經是root了耶...它竟然跟我說沒有權限修改這個檔案...>.<
差點沒瘋掉....研究好一陣子後...才知道原因
原來是該台主機安全性做得比較嚴謹,就是利用chattr來把部份檔案加上隱藏屬性

謎之音:你還有得學呢...


底下是chattr及lsattr的用法


[root@www ~]# chattr [+-=][ASacdistu] 檔案或目錄名稱
選項與參數:
+ :增加某一個特殊參數,其他原本存在參數則不動。
- :移除某一個特殊參數,其他原本存在參數則不動。
= :設定一定,且僅有後面接的參數

A :當設定了 A 這個屬性時,若你有存取此檔案(或目錄)時,他的存取時間 atime將不會被修改,可避免I/O較慢的機器過度的存取磁碟。這對速度較慢的電腦有幫助
S :一般檔案是非同步寫入磁碟的(原理請參考第五章sync的說明),如果加上 S 這個屬性時,當你進行任何檔案的修改,該更動會『同步』寫入磁碟中。
a :當設定 a 之後,這個檔案將只能增加資料,而不能刪除也不能修改資料,只有root才能設定這個屬性。
c :這個屬性設定之後,將會自動的將此檔案『壓縮』,在讀取的時候將會自動解壓縮,但是在儲存的時候,將會先進行壓縮後再儲存(看來對於大檔案似乎蠻有用的!)
d :當 dump 程序被執行的時候,設定 d 屬性將可使該檔案(或目錄)不會被 dump 備份
i :這個 i 可就很厲害了!他可以讓一個檔案『不能被刪除、改名、設定連結也無法寫入或新增資料!』對於系統安全性有相當大的助益!只有 root 能設定此屬性
s :當檔案設定了 s 屬性時,如果這個檔案被刪除,他將會被完全的移除出這個硬碟空間,所以如果誤刪了,完全無法救回來了喔!
u :與 s 相反的,當使用 u 來設定檔案時,如果該檔案被刪除了,則資料內容其實還存在磁碟中,可以使用來救援該檔案喔!
注意:屬性設定常見的是 a 與 i 的設定值,而且很多設定值必須要身為 root 才能設定




[root@www ~]# lsattr [-adR] 檔案或目錄
選項與參數:
-a :將隱藏檔的屬性也秀出來;
-d :如果接的是目錄,僅列出目錄本身的屬性而非目錄內的檔名;
-R :連同子目錄的資料也一併列出來!


參考資料來源:鳥哥的Linux私房菜
前一陣子幫手上管理的網站換到別台主機
要去修改sshd登入時要用的key時..竟然不能修改..
我己經是root了耶...它竟然跟我說沒有權限修改這個檔案...>.<
差點沒瘋掉....研究好一陣子後...才知道原因
原來是該台主機安全性做得比較嚴謹,就是利用chattr來把部份檔案加上隱藏屬性

謎之音:你還有得學呢...


底下是chattr及lsattr的用法


[root@www ~]# chattr [+-=][ASacdistu] 檔案或目錄名稱
選項與參數:
+ :增加某一個特殊參數,其他原本存在參數則不動。
- :移除某一個特殊參數,其他原本存在參數則不動。
= :設定一定,且僅有後面接的參數

A :當設定了 A 這個屬性時,若你有存取此檔案(或目錄)時,他的存取時間 atime將不會被修改,可避免I/O較慢的機器過度的存取磁碟。這對速度較慢的電腦有幫助
S :一般檔案是非同步寫入磁碟的(原理請參考第五章sync的說明),如果加上 S 這個屬性時,當你進行任何檔案的修改,該更動會『同步』寫入磁碟中。
a :當設定 a 之後,這個檔案將只能增加資料,而不能刪除也不能修改資料,只有root才能設定這個屬性。
c :這個屬性設定之後,將會自動的將此檔案『壓縮』,在讀取的時候將會自動解壓縮,但是在儲存的時候,將會先進行壓縮後再儲存(看來對於大檔案似乎蠻有用的!)
d :當 dump 程序被執行的時候,設定 d 屬性將可使該檔案(或目錄)不會被 dump 備份
i :這個 i 可就很厲害了!他可以讓一個檔案『不能被刪除、改名、設定連結也無法寫入或新增資料!』對於系統安全性有相當大的助益!只有 root 能設定此屬性
s :當檔案設定了 s 屬性時,如果這個檔案被刪除,他將會被完全的移除出這個硬碟空間,所以如果誤刪了,完全無法救回來了喔!
u :與 s 相反的,當使用 u 來設定檔案時,如果該檔案被刪除了,則資料內容其實還存在磁碟中,可以使用來救援該檔案喔!
注意:屬性設定常見的是 a 與 i 的設定值,而且很多設定值必須要身為 root 才能設定




[root@www ~]# lsattr [-adR] 檔案或目錄
選項與參數:
-a :將隱藏檔的屬性也秀出來;
-d :如果接的是目錄,僅列出目錄本身的屬性而非目錄內的檔名;
-R :連同子目錄的資料也一併列出來!


參考資料來源:鳥哥的Linux私房菜

2010年8月27日 星期五

linux 單一目錄檔案太多時該怎麼刪?

今天為了要清出硬碟空間...
硬是要刪掉一些東西
但老是遇到幾個目錄出現
bash: /bin/rm: Argument list too long
這樣的訊息....找了一下文章

發現原來是 rm 有最大一次刪除的數量,所以當一個目錄裡有太多的檔案或目錄時,就會出現錯誤,估計應該是在二萬以下,可以使用 find ./ | xargs rm -rf 來刪除,在這邊的目的是先使用 find 列出檔案,再導向到 xargs,xargs 再餵給 rm,在這裡,xargs 會分批依照 rm 的最大數量餵給 rm,然後就可以順利刪除檔案了

相關文章內容請詳閱文章出处:飞诺网(www.firnow.com) 今天為了要清出硬碟空間...
硬是要刪掉一些東西
但老是遇到幾個目錄出現
bash: /bin/rm: Argument list too long
這樣的訊息....找了一下文章

發現原來是 rm 有最大一次刪除的數量,所以當一個目錄裡有太多的檔案或目錄時,就會出現錯誤,估計應該是在二萬以下,可以使用 find ./ | xargs rm -rf 來刪除,在這邊的目的是先使用 find 列出檔案,再導向到 xargs,xargs 再餵給 rm,在這裡,xargs 會分批依照 rm 的最大數量餵給 rm,然後就可以順利刪除檔案了

相關文章內容請詳閱文章出处:飞诺网(www.firnow.com)

2010年6月3日 星期四

postfix+mysql(auth)+postfixadmin at centos

之前一直找到在其他linux套件上的做法,一直做不成功
(要嘛是debian的,要嘛是ubuntu的,不然就是fedora的)

主要是postfix+dovecot來完成的
(還有一個是搭配courier-imap,但這個我一直做不起來..>.<)
此篇文章主要是參考這一篇
(http://www.campworld.net/thewiki/pmwiki.php/LinuxServersCentOS/Cent5VirtMailServer)

下面的內容僅從中摘錄部份重點

首先要準備的幾個軟件
1.postfix with mysql(這個可以參考http://www.pigo.idv.tw/archives/323)
(centos預設的postfix是不支援mysql的,務必參考上述文章重新安裝)
2.Dovecot
3.mysql
4.httpd
5.postfixadmin
(這個是網頁的程序,麻煩自己去抓回來放在你的web目錄下,之後透過web就可以管理郵件帳號)
6.cyrus-sasl,cyrus-sasl-lib,cyrus-sasl-devel,cyrus-sasl-sql,cyrus-sasl-plain
上面除了1,5之外,其他都可以用centos5.4內建的套件就好(yum install xxxx)

首先把postfixadmin設定好
新版的postfixadmin在安裝上做了一些改良,使用者只要先把資料庫及使用者建立起來
以及修改config.inc.php這個檔案,剩下的就全都可以在網頁上完成了(不必再自己手動建立資料表)
(config.inc.php裡面也都有針對各項參數做說明)
如同下面的步驟
Now we need to setup the mysql database for mysqladmin. We only need to create the database and user. The setup file will create the rest.
> mysql -u root -p -e "CREATE DATABASE postfix;"
> mysql -u root -p -e "CREATE USER postfix@localhost IDENTIFIED BY 'choose_a_password';"
> mysql -u root -p -e "GRANT ALL PRIVILEGES ON postfix . * TO postfix@localhost;"

Now its time to setup the config file. Don't forget to set your password. Find the following items and change them.
> cd /usr/share/postfixadmin
> nano -w config.inc.php


# 這一行要改成true,否則無法安裝
$CONF['configured'] = true;

// Postfix Admin Path
// Set the location to your Postfix Admin installation here.
$CONF['postfix_admin_url'] = '/mailadmin/';

// Database Config
// mysql = MySQL 3.23 and 4.0
// mysqli = MySQL 4.1
// pgsql = PostgreSQL
$CONF['database_type'] = 'mysqli';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = 'postfixadmin';
$CONF['database_password'] = 'postfixadmin';
$CONF['database_name'] = 'postfix';
$CONF['database_prefix'] = '';


$CONF['domain_path'] = 'YES';
$CONF['domain_in_mailbox'] = 'NO';
$CONF['encrypt'] = 'cleartext';


接下來,換設定一下postfix的main.cf(/etc/postfix/main.cf)
關於postfix原本的一些設定我就不多談了
(如下這些)
# network settings
inet_interfaces = all
mydomain = yourdomain.com
myhostname = host.yourdomain.com
mynetworks = 192.168.0.0/16, 127.0.0.0/24,
mydestination = $myhostname, localhost.$mydomain, localhost
relay_domains = $mydestination
# mail delivery
recipient_delimiter = +
========================
上面這些設定用預設也行,要針對自己的情況修改也行
參考鳥哥的文章可以瞭解詳細內容(簡易 Mail Server 架設 -- Postfix 設定)
或是連到
HOWTO Virtual Mail Hosting on CentOS 5.x - Postfix MySQL Dovecot Postfix Admin
這篇原本的文章中,參考它文中所附上的完整main.cf及master.cf設定檔內容

本文只針對要利用mysql來管理所需增設的一些設定
在/etc/postfix/main.cf新增下述設定

# virtual setup
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual_alias_maps.cf,
regexp:/etc/postfix/virtual_regexp
virtual_gid_maps = static:89 #your postfix gid
virtual_mailbox_base = /home/vmail
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual_domains_maps.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual_mailbox_maps.cf
virtual_minimum_uid = 89
virtual_transport = virtual
virtual_uid_maps = static:89 #your postfix uid

# authentication
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = $myhostname
broken_sasl_auth_clients = yes

# tls config
smtp_use_tls = yes
smtpd_use_tls = yes
smtp_tls_note_starttls_offer = yes
smtpd_tls_key_file = /etc/postfix/ssl/smtpd.pem
smtpd_tls_cert_file = /etc/postfix/ssl/smtpd.pem
smtpd_tls_CAfile = /etc/postfix/ssl/smtpd.pem
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
tls_random_source = dev:/dev/urandom

# rules restrictions
# smtpd_client_restrictions = reject_rbl_client zen.spamhaus.org
smtpd_helo_restrictions = permit_sasl_authenticated,
permit_mynetworks,
reject_non_fqdn_hostname
smtpd_sender_restrictions = reject_non_fqdn_sender,
reject_unknown_sender_domain
smtpd_recipient_restrictions = permit_sasl_authenticated,
permit_mynetworks,
reject_unauth_destination,
reject_non_fqdn_recipient,
reject_unknown_recipient_domain
smtpd_helo_required = yes
unknown_local_recipient_reject_code = 550
disable_vrfy_command = yes
smtpd_data_restrictions = reject_unauth_pipelining


然後新增下面幾個個檔案
The postfix / mysql config files.

/etc/postfix/mysql-virtual_alias_maps.cf

hosts = localhost
user = postfix
password = postfix
dbname = postfix
table = alias
select_field = goto
where_field = address


/etc/postfix/mysql-virtual_domains_maps.cf

hosts = localhost
user = postfix
password = postfix
dbname = postfix
table = domain
select_field = domain
where_field = domain
additional_conditions = and backupmx = '0' and active = '1'
這裡要注意一下,我在postfixadmin新增網域時,把"備份網域"勾起來了,造成我信件一直被主機退回
上面這一行sql語法,就是會造成找不到允許接收信件網域的原因
看是要把備份網域取消,或是修改這一行,把backupmx = '0' 拿掉都行


/etc/postfix/mysql-virtual_mailbox_maps.cf

hosts = localhost
user = postfix
password = postfix
dbname = postfix
table = mailbox
select_field = maildir
where_field = username


接下來,修改這個檔案(讓smtp在寄信要求驗證時使用的設定檔)
/usr/lib/sasl2/smtpd.conf


pwcheck_method: auxprop
mech_list: PLAIN LOGIN
auxprop_plugin: sql
sql_verbose: yes
sql_engine: mysql
sql_hostnames: localhost
sql_user: postfix
sql_passwd: postfix
sql_database: postfix
sql_select: select password from mailbox where username = '%u@%r'


接下來,產生ssl的key讓postfix可以支援TLS

Now generate an SSL certificate for postfix to have TLS support.
> mkdir /etc/postfix/ssl
> cd /etc/postfix/ssl
> openssl req -new -x509 -nodes -out smtpd.pem -keyout smtpd.pem -days 3650

We need to touch a file. So type the follwoing.
> touch /etc/postfix/virtual_regexp
上面這個動作,就是在main.cf中
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual_alias_maps.cf,
regexp:/etc/postfix/virtual_regexp
這一行要用到的檔案,讓你也可以手動編輯允許收信的電子郵件及網域
可以參考http://www.sympa.org/faq/postfix這篇文章
內文主要就是在講這檔案的用途

接下來是設定一下信件存放的目錄
Finally we'll configure the mail store directory. We put it in the /home directory to make backups and other item easy. So type the following.
> mkdir /home/vmail
> chmod 770 /home/vmail
> chown postfix:postfix /home/vmail

最後,修改dovecot的設定檔(/etc/dovecot.conf)

# Dovecot config file
auth default {
userdb sql {
args = /etc/dovecot-mysql.conf
}
passdb sql {
args = /etc/dovecot-mysql.conf
}
}
first_valid_uid = 89
default_mail_env = maildir:/home/vmail/%d/%n
protocols = imaps imap pop3s pop3
ssl_cert_file = /etc/postfix/ssl/smtpd.pem
ssl_key_file = /etc/postfix/ssl/smtpd.pem


新增/etc/dovecot-mysql.conf ,內容如下

driver = mysql
connect = host=localhost dbname=postfix user=postfix password=yourpassword
default_pass_scheme = PLAIN
password_query = SELECT password FROM mailbox WHERE username = '%u'
user_query = SELECT maildir, 89 AS uid, 89 AS gid FROM mailbox WHERE username = '%u'


到這裡,整個作業就完成了,把postfix,dovecot都重新啟動後
這樣postfix就可以用postfixadmin來做管理了

文章只針對postfix,dovecot(pop3,imap)的部份做重點摘錄

之前一直找到在其他linux套件上的做法,一直做不成功
(要嘛是debian的,要嘛是ubuntu的,不然就是fedora的)

主要是postfix+dovecot來完成的
(還有一個是搭配courier-imap,但這個我一直做不起來..>.<)
此篇文章主要是參考這一篇
(http://www.campworld.net/thewiki/pmwiki.php/LinuxServersCentOS/Cent5VirtMailServer)

下面的內容僅從中摘錄部份重點

首先要準備的幾個軟件
1.postfix with mysql(這個可以參考http://www.pigo.idv.tw/archives/323)
(centos預設的postfix是不支援mysql的,務必參考上述文章重新安裝)
2.Dovecot
3.mysql
4.httpd
5.postfixadmin
(這個是網頁的程序,麻煩自己去抓回來放在你的web目錄下,之後透過web就可以管理郵件帳號)
6.cyrus-sasl,cyrus-sasl-lib,cyrus-sasl-devel,cyrus-sasl-sql,cyrus-sasl-plain
上面除了1,5之外,其他都可以用centos5.4內建的套件就好(yum install xxxx)

首先把postfixadmin設定好
新版的postfixadmin在安裝上做了一些改良,使用者只要先把資料庫及使用者建立起來
以及修改config.inc.php這個檔案,剩下的就全都可以在網頁上完成了(不必再自己手動建立資料表)
(config.inc.php裡面也都有針對各項參數做說明)
如同下面的步驟
Now we need to setup the mysql database for mysqladmin. We only need to create the database and user. The setup file will create the rest.
> mysql -u root -p -e "CREATE DATABASE postfix;"
> mysql -u root -p -e "CREATE USER postfix@localhost IDENTIFIED BY 'choose_a_password';"
> mysql -u root -p -e "GRANT ALL PRIVILEGES ON postfix . * TO postfix@localhost;"

Now its time to setup the config file. Don't forget to set your password. Find the following items and change them.
> cd /usr/share/postfixadmin
> nano -w config.inc.php


# 這一行要改成true,否則無法安裝
$CONF['configured'] = true;

// Postfix Admin Path
// Set the location to your Postfix Admin installation here.
$CONF['postfix_admin_url'] = '/mailadmin/';

// Database Config
// mysql = MySQL 3.23 and 4.0
// mysqli = MySQL 4.1
// pgsql = PostgreSQL
$CONF['database_type'] = 'mysqli';
$CONF['database_host'] = 'localhost';
$CONF['database_user'] = 'postfixadmin';
$CONF['database_password'] = 'postfixadmin';
$CONF['database_name'] = 'postfix';
$CONF['database_prefix'] = '';


$CONF['domain_path'] = 'YES';
$CONF['domain_in_mailbox'] = 'NO';
$CONF['encrypt'] = 'cleartext';


接下來,換設定一下postfix的main.cf(/etc/postfix/main.cf)
關於postfix原本的一些設定我就不多談了
(如下這些)
# network settings
inet_interfaces = all
mydomain = yourdomain.com
myhostname = host.yourdomain.com
mynetworks = 192.168.0.0/16, 127.0.0.0/24,
mydestination = $myhostname, localhost.$mydomain, localhost
relay_domains = $mydestination
# mail delivery
recipient_delimiter = +
========================
上面這些設定用預設也行,要針對自己的情況修改也行
參考鳥哥的文章可以瞭解詳細內容(簡易 Mail Server 架設 -- Postfix 設定)
或是連到
HOWTO Virtual Mail Hosting on CentOS 5.x - Postfix MySQL Dovecot Postfix Admin
這篇原本的文章中,參考它文中所附上的完整main.cf及master.cf設定檔內容

本文只針對要利用mysql來管理所需增設的一些設定
在/etc/postfix/main.cf新增下述設定

# virtual setup
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual_alias_maps.cf,
regexp:/etc/postfix/virtual_regexp
virtual_gid_maps = static:89 #your postfix gid
virtual_mailbox_base = /home/vmail
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual_domains_maps.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual_mailbox_maps.cf
virtual_minimum_uid = 89
virtual_transport = virtual
virtual_uid_maps = static:89 #your postfix uid

# authentication
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = $myhostname
broken_sasl_auth_clients = yes

# tls config
smtp_use_tls = yes
smtpd_use_tls = yes
smtp_tls_note_starttls_offer = yes
smtpd_tls_key_file = /etc/postfix/ssl/smtpd.pem
smtpd_tls_cert_file = /etc/postfix/ssl/smtpd.pem
smtpd_tls_CAfile = /etc/postfix/ssl/smtpd.pem
smtpd_tls_loglevel = 1
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
tls_random_source = dev:/dev/urandom

# rules restrictions
# smtpd_client_restrictions = reject_rbl_client zen.spamhaus.org
smtpd_helo_restrictions = permit_sasl_authenticated,
permit_mynetworks,
reject_non_fqdn_hostname
smtpd_sender_restrictions = reject_non_fqdn_sender,
reject_unknown_sender_domain
smtpd_recipient_restrictions = permit_sasl_authenticated,
permit_mynetworks,
reject_unauth_destination,
reject_non_fqdn_recipient,
reject_unknown_recipient_domain
smtpd_helo_required = yes
unknown_local_recipient_reject_code = 550
disable_vrfy_command = yes
smtpd_data_restrictions = reject_unauth_pipelining


然後新增下面幾個個檔案
The postfix / mysql config files.

/etc/postfix/mysql-virtual_alias_maps.cf

hosts = localhost
user = postfix
password = postfix
dbname = postfix
table = alias
select_field = goto
where_field = address


/etc/postfix/mysql-virtual_domains_maps.cf

hosts = localhost
user = postfix
password = postfix
dbname = postfix
table = domain
select_field = domain
where_field = domain
additional_conditions = and backupmx = '0' and active = '1'
這裡要注意一下,我在postfixadmin新增網域時,把"備份網域"勾起來了,造成我信件一直被主機退回
上面這一行sql語法,就是會造成找不到允許接收信件網域的原因
看是要把備份網域取消,或是修改這一行,把backupmx = '0' 拿掉都行


/etc/postfix/mysql-virtual_mailbox_maps.cf

hosts = localhost
user = postfix
password = postfix
dbname = postfix
table = mailbox
select_field = maildir
where_field = username


接下來,修改這個檔案(讓smtp在寄信要求驗證時使用的設定檔)
/usr/lib/sasl2/smtpd.conf


pwcheck_method: auxprop
mech_list: PLAIN LOGIN
auxprop_plugin: sql
sql_verbose: yes
sql_engine: mysql
sql_hostnames: localhost
sql_user: postfix
sql_passwd: postfix
sql_database: postfix
sql_select: select password from mailbox where username = '%u@%r'


接下來,產生ssl的key讓postfix可以支援TLS

Now generate an SSL certificate for postfix to have TLS support.
> mkdir /etc/postfix/ssl
> cd /etc/postfix/ssl
> openssl req -new -x509 -nodes -out smtpd.pem -keyout smtpd.pem -days 3650

We need to touch a file. So type the follwoing.
> touch /etc/postfix/virtual_regexp
上面這個動作,就是在main.cf中
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual_alias_maps.cf,
regexp:/etc/postfix/virtual_regexp
這一行要用到的檔案,讓你也可以手動編輯允許收信的電子郵件及網域
可以參考http://www.sympa.org/faq/postfix這篇文章
內文主要就是在講這檔案的用途

接下來是設定一下信件存放的目錄
Finally we'll configure the mail store directory. We put it in the /home directory to make backups and other item easy. So type the following.
> mkdir /home/vmail
> chmod 770 /home/vmail
> chown postfix:postfix /home/vmail

最後,修改dovecot的設定檔(/etc/dovecot.conf)

# Dovecot config file
auth default {
userdb sql {
args = /etc/dovecot-mysql.conf
}
passdb sql {
args = /etc/dovecot-mysql.conf
}
}
first_valid_uid = 89
default_mail_env = maildir:/home/vmail/%d/%n
protocols = imaps imap pop3s pop3
ssl_cert_file = /etc/postfix/ssl/smtpd.pem
ssl_key_file = /etc/postfix/ssl/smtpd.pem


新增/etc/dovecot-mysql.conf ,內容如下

driver = mysql
connect = host=localhost dbname=postfix user=postfix password=yourpassword
default_pass_scheme = PLAIN
password_query = SELECT password FROM mailbox WHERE username = '%u'
user_query = SELECT maildir, 89 AS uid, 89 AS gid FROM mailbox WHERE username = '%u'


到這裡,整個作業就完成了,把postfix,dovecot都重新啟動後
這樣postfix就可以用postfixadmin來做管理了

文章只針對postfix,dovecot(pop3,imap)的部份做重點摘錄

2010年6月2日 星期三

別輕估自己在朋友心中的重要性

這是一篇轉載的文章,看完後深有同感
但我的情況倒不像文章中有那麼大的改變

而是一些讓我一輩子都忘不掉的一句話
或是造成我日後做事的一些準則之類的

朋友,感謝有你們,才會有今天的我


我唸高一時,有一天看到一位同班同學吉米‧凱從學校走回家;他看來是把所有在學校用的書要都帶回家。我想著:為什麼有人要在禮拜五把所有的書都帶回家呢?他一定是個很無趣的人。這個週末我已經計畫好參加一個宴會加上明天下午與朋友們來一場足球賽;所以我聳了聳肩,繼續走在回家的路。

不一會兒,我看到一群小孩跑向他,撞了過去,把他的書全撞飛了,並且絆倒他,讓他跌到泥中。他的眼鏡也掉在離他有十尺遠的草地上,>當他抬頭起來時,我看到他流露出很悲傷的眼神;那時我心軟了,我趕緊跑到他的身邊幫他找到眼鏡,同時看到了他眼角的淚光。

當我把眼鏡遞還給他時,「那些小孩真是混蛋,他們真的是欠扁!」他臉上浮出一個大笑容,說:「謝了!」。那不是普通的一笑,而是由心裡發出對他人真誠的謝意。

我幫他撿起散落的書,並問他住在那裡,原來他住在我家附近,但我卻不曾看過他。

他說,因為之前他是上私立學校。我和他一直聊天到家,我也幫他揹著他的書,我又發現,他是一個蠻酷的小子。分手前,我問他要不要在禮拜日一起去踢足球。他說好。我們就整個週末都玩在一起,而且我又發現越認識吉米,我越喜歡他;我的朋友們也有同感。

禮拜一早上,我又碰到吉米和他那一大堆的書。我問他:「你真是不簡單喔,每天這樣下去,你的臂力將會不得了喔!」他只是笑笑,並把一半的書丟給我。在後來的四年,我跟吉米成了最好的朋友。當我們唸到高四時(這是美國的學制),經過一番考慮,吉米決定要到喬治城大學讀醫學,而我要到伯爵大學唸書;但我知道我們會永遠都是朋友。

畢業那一年是由吉米代表畢業班致詞,我一直以這是很無趣的事來開他的玩笑。畢業典禮的那一天,我見到吉米,他真是帥呆了!他胖了一點,帶眼鏡也比較好看些;而且他很受女孩們的喜歡,比我有更多的約會?天啊!有時候我真的會嫉妒耶!這時我看出他很緊張要上台致詞,所以就拍拍他的背,又說:「嘿!你一定沒問題的!」他很感激的看著我,並笑著說「謝謝!」

他上台後,先清了清喉嚨開始他的致詞,「畢業是要來感謝一些曾經幫你度過難關的人,

比如是你的父母、老師、兄弟姊妹,或是你的教練...和你的朋友們。在這裡我要告訴大家,

「做一個人的朋友」是你可以給對方的最好禮物。我要來說一個故事.......」我以不可思議的眼神看著他,當他講著我們第一次相遇的故事。他說,那時正計畫要在週末時自殺,於是把學校置物箱裡的東西都清光了,希望死後媽媽不必再為他收拾殘局。然後,他很認真的看著我,並對我微笑,「很幸運的,我被救了,我被我的朋友從要做的錯事中救了出來。」當全場的聽眾聽到這位帥哥說出這件事時,歎息聲四起;我看到他的雙親看著我,並且對我報以感激的微笑。直到那時我才發現到,千萬不要低估自己的行動可能帶來的後果,也許一個小小的動作可以改變一個人的一生。不管世界變的怎樣,上帝讓我們和別人的生活交錯在一起時,

要我們要儘量找出對方的優點來!

--摘自耕心週刊

這是一篇轉載的文章,看完後深有同感
但我的情況倒不像文章中有那麼大的改變

而是一些讓我一輩子都忘不掉的一句話
或是造成我日後做事的一些準則之類的

朋友,感謝有你們,才會有今天的我


我唸高一時,有一天看到一位同班同學吉米‧凱從學校走回家;他看來是把所有在學校用的書要都帶回家。我想著:為什麼有人要在禮拜五把所有的書都帶回家呢?他一定是個很無趣的人。這個週末我已經計畫好參加一個宴會加上明天下午與朋友們來一場足球賽;所以我聳了聳肩,繼續走在回家的路。

不一會兒,我看到一群小孩跑向他,撞了過去,把他的書全撞飛了,並且絆倒他,讓他跌到泥中。他的眼鏡也掉在離他有十尺遠的草地上,>當他抬頭起來時,我看到他流露出很悲傷的眼神;那時我心軟了,我趕緊跑到他的身邊幫他找到眼鏡,同時看到了他眼角的淚光。

當我把眼鏡遞還給他時,「那些小孩真是混蛋,他們真的是欠扁!」他臉上浮出一個大笑容,說:「謝了!」。那不是普通的一笑,而是由心裡發出對他人真誠的謝意。

我幫他撿起散落的書,並問他住在那裡,原來他住在我家附近,但我卻不曾看過他。

他說,因為之前他是上私立學校。我和他一直聊天到家,我也幫他揹著他的書,我又發現,他是一個蠻酷的小子。分手前,我問他要不要在禮拜日一起去踢足球。他說好。我們就整個週末都玩在一起,而且我又發現越認識吉米,我越喜歡他;我的朋友們也有同感。

禮拜一早上,我又碰到吉米和他那一大堆的書。我問他:「你真是不簡單喔,每天這樣下去,你的臂力將會不得了喔!」他只是笑笑,並把一半的書丟給我。在後來的四年,我跟吉米成了最好的朋友。當我們唸到高四時(這是美國的學制),經過一番考慮,吉米決定要到喬治城大學讀醫學,而我要到伯爵大學唸書;但我知道我們會永遠都是朋友。

畢業那一年是由吉米代表畢業班致詞,我一直以這是很無趣的事來開他的玩笑。畢業典禮的那一天,我見到吉米,他真是帥呆了!他胖了一點,帶眼鏡也比較好看些;而且他很受女孩們的喜歡,比我有更多的約會?天啊!有時候我真的會嫉妒耶!這時我看出他很緊張要上台致詞,所以就拍拍他的背,又說:「嘿!你一定沒問題的!」他很感激的看著我,並笑著說「謝謝!」

他上台後,先清了清喉嚨開始他的致詞,「畢業是要來感謝一些曾經幫你度過難關的人,

比如是你的父母、老師、兄弟姊妹,或是你的教練...和你的朋友們。在這裡我要告訴大家,

「做一個人的朋友」是你可以給對方的最好禮物。我要來說一個故事.......」我以不可思議的眼神看著他,當他講著我們第一次相遇的故事。他說,那時正計畫要在週末時自殺,於是把學校置物箱裡的東西都清光了,希望死後媽媽不必再為他收拾殘局。然後,他很認真的看著我,並對我微笑,「很幸運的,我被救了,我被我的朋友從要做的錯事中救了出來。」當全場的聽眾聽到這位帥哥說出這件事時,歎息聲四起;我看到他的雙親看著我,並且對我報以感激的微笑。直到那時我才發現到,千萬不要低估自己的行動可能帶來的後果,也許一個小小的動作可以改變一個人的一生。不管世界變的怎樣,上帝讓我們和別人的生活交錯在一起時,

要我們要儘量找出對方的優點來!

--摘自耕心週刊

注意飲食

脂肪瘤好像變多了...>.<

飲食習慣上有沒有多吃什麼能避免脂肪瘤的復發,或者少吃哪類食物?
不妨掌握下列原則:
1.盡量選擇燙的或煮的食材,避免油炸食物;
2.避免喝酒,因為每公克酒精會直接代謝、以脂肪形式儲存之;
3.每日熱量控制原則在二千大卡以內;
4.少吃消夜、少用油炸、少放調味料。





有益脂肪代謝的蔬果舉例

1.蔬果名稱:繖狀花科的胡蘿蔔與芹菜;洋 類:大蒜、韭菜、蘆筍、洋禾本
科的玉米、小麥與燕麥;對身體的好處:維生素A與胡蘿蔔素可以除去老化和提
供肝臟必要營養,加速脂肪代謝。

2.蔬果名稱:十字花科:甘藍、花椰菜
對身體的好處:豐富的膳食纖維可以減低脂肪的蓄積,加速體內糞便的排出。

3.蔬果名稱:香瓜、檸檬、西瓜、蘆薈、番茄、絲瓜
對身體的好處:除了有豐富的維他命C之外,這些水果也含有穩定血壓的鉀礦物
質,讓身體代謝正常化。



脂肪瘤

  脂肪瘤是相當常見的皮下良性腫瘤,其內容物為脂肪,脂肪瘤通常它的外圍有相當薄的一層纖維層,以和周圍的正常組織隔開。但有時也會沒有這層纖維層,因而不易和附近正常的脂肪組織做區分。

  脂肪瘤好發的部位可以遍及全身,最常見的位置是後背部、肩牓、後頸等部位,部份的病人也會有全身多發性的脂肪瘤。

  脂肪瘤本身極少會有惡性的變化。治療的方法便是手術切除,通常病人要求手術的時機,是因為脂肪瘤造成異物感,或皮膚的隆起。少部份的病人,因為脂肪瘤和鄰近脂肪組織不易區分,所以無法完全切除,造成復發。 http://bigchao.myweb.hinet.net/med/ps/chao_4.htm
脂肪瘤是一種良性腫瘤,多發生於皮下。瘤周有一層薄的結締組織包囊,內有被結締組織束分成葉狀成群的正常脂肪細胞。有的脂肪瘤在結構上除大量脂肪組織外,還含有較多結締組織或血管,即形成複雜的脂肪瘤。

病因
瘤周有一層薄的結締組織包囊,內有
被結締組織束分成葉狀成群的正常脂肪細胞。有的脂肪瘤在結構上除大量脂肪組織外,還含有較多結締組織或血管,即形成複雜的脂肪瘤。

症狀
此類腫瘤好發於肩、背、臀部及大腿內側,頭部發病也常見。位於皮下組織內的脂肪瘤大小不一,大多呈扁圓形或分葉,分界清楚;邊界分不清者要提防惡性脂肪瘤的可能。腫瘤質軟有彈性(注意與較大的囊腫區別),有的可有假性波動感。腫瘤不與表皮粘連,皮膚表面完全正常,基部較廣泛。檢查時以手緊壓脂肪瘤基部,可見分葉形態。皮膚可出現“桔皮”狀。腫瘤發展甚緩慢,大多對機體無嚴重不良影響,惡性變者甚少。

此外另有一類多發性圓形或卵圓形結節狀脂肪瘤,常見於四肢、腰、腹部皮下。腫瘤大小及數目不定,較一般脂肪瘤略硬,壓迫時疼痛,因而稱為痛性脂肪瘤或多發性脂肪瘤。



所有文章均從網路轉載而來,若有侵犯到原作者權益敬請告知,定會馬上處理!

脂肪瘤好像變多了...>.<

飲食習慣上有沒有多吃什麼能避免脂肪瘤的復發,或者少吃哪類食物?
不妨掌握下列原則:
1.盡量選擇燙的或煮的食材,避免油炸食物;
2.避免喝酒,因為每公克酒精會直接代謝、以脂肪形式儲存之;
3.每日熱量控制原則在二千大卡以內;
4.少吃消夜、少用油炸、少放調味料。





有益脂肪代謝的蔬果舉例

1.蔬果名稱:繖狀花科的胡蘿蔔與芹菜;洋 類:大蒜、韭菜、蘆筍、洋禾本
科的玉米、小麥與燕麥;對身體的好處:維生素A與胡蘿蔔素可以除去老化和提
供肝臟必要營養,加速脂肪代謝。

2.蔬果名稱:十字花科:甘藍、花椰菜
對身體的好處:豐富的膳食纖維可以減低脂肪的蓄積,加速體內糞便的排出。

3.蔬果名稱:香瓜、檸檬、西瓜、蘆薈、番茄、絲瓜
對身體的好處:除了有豐富的維他命C之外,這些水果也含有穩定血壓的鉀礦物
質,讓身體代謝正常化。



脂肪瘤

  脂肪瘤是相當常見的皮下良性腫瘤,其內容物為脂肪,脂肪瘤通常它的外圍有相當薄的一層纖維層,以和周圍的正常組織隔開。但有時也會沒有這層纖維層,因而不易和附近正常的脂肪組織做區分。

  脂肪瘤好發的部位可以遍及全身,最常見的位置是後背部、肩牓、後頸等部位,部份的病人也會有全身多發性的脂肪瘤。

  脂肪瘤本身極少會有惡性的變化。治療的方法便是手術切除,通常病人要求手術的時機,是因為脂肪瘤造成異物感,或皮膚的隆起。少部份的病人,因為脂肪瘤和鄰近脂肪組織不易區分,所以無法完全切除,造成復發。 http://bigchao.myweb.hinet.net/med/ps/chao_4.htm
脂肪瘤是一種良性腫瘤,多發生於皮下。瘤周有一層薄的結締組織包囊,內有被結締組織束分成葉狀成群的正常脂肪細胞。有的脂肪瘤在結構上除大量脂肪組織外,還含有較多結締組織或血管,即形成複雜的脂肪瘤。

病因
瘤周有一層薄的結締組織包囊,內有
被結締組織束分成葉狀成群的正常脂肪細胞。有的脂肪瘤在結構上除大量脂肪組織外,還含有較多結締組織或血管,即形成複雜的脂肪瘤。

症狀
此類腫瘤好發於肩、背、臀部及大腿內側,頭部發病也常見。位於皮下組織內的脂肪瘤大小不一,大多呈扁圓形或分葉,分界清楚;邊界分不清者要提防惡性脂肪瘤的可能。腫瘤質軟有彈性(注意與較大的囊腫區別),有的可有假性波動感。腫瘤不與表皮粘連,皮膚表面完全正常,基部較廣泛。檢查時以手緊壓脂肪瘤基部,可見分葉形態。皮膚可出現“桔皮”狀。腫瘤發展甚緩慢,大多對機體無嚴重不良影響,惡性變者甚少。

此外另有一類多發性圓形或卵圓形結節狀脂肪瘤,常見於四肢、腰、腹部皮下。腫瘤大小及數目不定,較一般脂肪瘤略硬,壓迫時疼痛,因而稱為痛性脂肪瘤或多發性脂肪瘤。



所有文章均從網路轉載而來,若有侵犯到原作者權益敬請告知,定會馬上處理!

2010年5月25日 星期二

vsftpd denyhost

本來打算改一下denyhosts的設定檔就好
但一直無法成功
只好另外找一個專門寫來檢查vsftpd.log的python程式

用法也很簡單,直接執行該檔案就好
(系統要安裝python)


下載點:
vsftpd_denyhost.py
本來打算改一下denyhosts的設定檔就好
但一直無法成功
只好另外找一個專門寫來檢查vsftpd.log的python程式

用法也很簡單,直接執行該檔案就好
(系統要安裝python)


下載點:
vsftpd_denyhost.py

2010年4月30日 星期五

mysql匯入/匯出

備份及匯入 mysql database
備份 SQL data:
>mysqldump -u 使用者名稱 -p –default-character-set=utf8 資料庫名稱 > backup.sql

匯入 SQL data:
>mysql -u 使用者名稱 -p 資料庫名稱 < backup.sql 備份及匯入 mysql database
備份 SQL data:
>mysqldump -u 使用者名稱 -p –default-character-set=utf8 資料庫名稱 > backup.sql

匯入 SQL data:
>mysql -u 使用者名稱 -p 資料庫名稱 < backup.sql

2010年4月22日 星期四

How to use ftp in a shell script

公司內部在用的備份機制原本用wput來上傳的
但無奈換個ftp server後,就一直無法順利上傳
研判應該是wput無法針對新版的ftp server正確使用PASV模式
於是只好改用shell script直接上傳
下面的資料摘自How to use ftp in a shell script


Example (non-working) script

#!/bin/sh
HOST='ftp.users.qwest.net'
USER='yourid'
PASSWD='yourpw'
FILE='file.txt'

ftp $HOST <<END_SCRIPT
user $USER
$PASSWD
put $FILE
quit
END_SCRIPT
exit 0

The above script will just hang if run in the foreground (in an xterm), or if run in the background (from a cron job), it will fail to perform the work of transferring file.txt.

/dev/tty names a strange, magic device. Each process (more strictly each process group) has a different /dev/tty, and you can not naively make ftp clients read the password from some non-magic, yet convenient source, like a "here document". When run in an xterm, the script above appears to hang because it reads the password from /dev/tty. The xterm constitutes the script's /dev/tty, so the script waits for keyboard input.

Example Working Script

#!/bin/sh
HOST='ftp.users.qwest.net'
USER='yourid'
PASSWD='yourpw'
FILE='file.txt'

ftp -n $HOST <<END_SCRIPT
quote USER $USER
quote PASS $PASSWD
put $FILE
quit
END_SCRIPT
exit 0

公司內部在用的備份機制原本用wput來上傳的
但無奈換個ftp server後,就一直無法順利上傳
研判應該是wput無法針對新版的ftp server正確使用PASV模式
於是只好改用shell script直接上傳
下面的資料摘自How to use ftp in a shell script


Example (non-working) script

#!/bin/sh
HOST='ftp.users.qwest.net'
USER='yourid'
PASSWD='yourpw'
FILE='file.txt'

ftp $HOST <<END_SCRIPT
user $USER
$PASSWD
put $FILE
quit
END_SCRIPT
exit 0

The above script will just hang if run in the foreground (in an xterm), or if run in the background (from a cron job), it will fail to perform the work of transferring file.txt.

/dev/tty names a strange, magic device. Each process (more strictly each process group) has a different /dev/tty, and you can not naively make ftp clients read the password from some non-magic, yet convenient source, like a "here document". When run in an xterm, the script above appears to hang because it reads the password from /dev/tty. The xterm constitutes the script's /dev/tty, so the script waits for keyboard input.

Example Working Script

#!/bin/sh
HOST='ftp.users.qwest.net'
USER='yourid'
PASSWD='yourpw'
FILE='file.txt'

ftp -n $HOST <<END_SCRIPT
quote USER $USER
quote PASS $PASSWD
put $FILE
quit
END_SCRIPT
exit 0

2010年3月22日 星期一

在javascript中抓取陣列資料

記錄在javascript中如何取得在HTML中的陣列資料
以及如何將之讀取出來


一般來說,我們在javascript裡使用的陣列型態的方法如下
例:

//宣告
var url_arr=new Array('software.sopili.net','dev.sopili.net');
//讀取
for(var i in url_arr){document.write(url_arr[i]+'
');}

那,如果想要像php一樣,array的key值是用字串
例:

$url_arr=Array('software'=>'software.sopili.net','dev'=>'dev.sopili.net');
foreach($url_arr as $key=>$value){
echo $key."
";
//重點是 key,有時候非常的需要key這個值,然後是字串型態
}


這時候要用JSON的格式
例:

//宣告
var url_arr={'software':'software.sopili.net','dev':'dev.sopili.net'};
//讀取
for(var key in url_arr){
//這裡面的key值,就真的是字串了!
document.write(url_arr[key]+'
');
}

接下來,要如何從html裡面讀取陣列的值呢?
假使資料來源如下:

<input name="education[]" type="text" size="20" maxlength="40" />
<input name="education[]" type="text" size="20" maxlength="40" />
<input name="education[]" type="text" size="20" maxlength="40" />

PHP的用法很簡單,直接使用"education"這個名稱就好
例:

foreach($_POST['education'] as $key=>$value) echo $key.' '.$value;

javascript的麻煩一點,但差不多的用法
例:

var mutli_education = document.form_name.elements["education[]"];
for(i=0;i < mutli_education.length;i++){ alert(mutli_education[i].value);}


參考資料:
1.http://dev.sopili.net/2008/11/javascriptarraykey_6376.html
2.http://roshanbh.com.np/2008/08/handling-array-html-form-elements-javascript-php.html
記錄在javascript中如何取得在HTML中的陣列資料
以及如何將之讀取出來


一般來說,我們在javascript裡使用的陣列型態的方法如下
例:

//宣告
var url_arr=new Array('software.sopili.net','dev.sopili.net');
//讀取
for(var i in url_arr){document.write(url_arr[i]+'
');}

那,如果想要像php一樣,array的key值是用字串
例:

$url_arr=Array('software'=>'software.sopili.net','dev'=>'dev.sopili.net');
foreach($url_arr as $key=>$value){
echo $key."
";
//重點是 key,有時候非常的需要key這個值,然後是字串型態
}


這時候要用JSON的格式
例:

//宣告
var url_arr={'software':'software.sopili.net','dev':'dev.sopili.net'};
//讀取
for(var key in url_arr){
//這裡面的key值,就真的是字串了!
document.write(url_arr[key]+'
');
}

接下來,要如何從html裡面讀取陣列的值呢?
假使資料來源如下:

<input name="education[]" type="text" size="20" maxlength="40" />
<input name="education[]" type="text" size="20" maxlength="40" />
<input name="education[]" type="text" size="20" maxlength="40" />

PHP的用法很簡單,直接使用"education"這個名稱就好
例:

foreach($_POST['education'] as $key=>$value) echo $key.' '.$value;

javascript的麻煩一點,但差不多的用法
例:

var mutli_education = document.form_name.elements["education[]"];
for(i=0;i < mutli_education.length;i++){ alert(mutli_education[i].value);}


參考資料:
1.http://dev.sopili.net/2008/11/javascriptarraykey_6376.html
2.http://roshanbh.com.np/2008/08/handling-array-html-form-elements-javascript-php.html

2010年3月16日 星期二

使用yum時遇到的錯誤

常會遇見在CentOS下使用yum或rpm指令時,發生錯誤:
錯誤訊息大概都大同小異
例:
rpmdb: Lock table is out of available locker entries
rpmdb: Unknown locker ID: xxxx.....

主要做法如下,更新後即可使用


1. rm /var/lib/rpm/__db.00*
2. rpm --rebuilddb

rebuilddb之後,再重新執行安裝即可。

參考資料來源:http://www.kume.idv.tw/read-254.html
常會遇見在CentOS下使用yum或rpm指令時,發生錯誤:
錯誤訊息大概都大同小異
例:
rpmdb: Lock table is out of available locker entries
rpmdb: Unknown locker ID: xxxx.....

主要做法如下,更新後即可使用


1. rm /var/lib/rpm/__db.00*
2. rpm --rebuilddb

rebuilddb之後,再重新執行安裝即可。

參考資料來源:http://www.kume.idv.tw/read-254.html

2010年3月8日 星期一

刪除特定的process

由於有些程式會當掉,於是用了笨方法,每n小時就重啟
原本是用killall xxxx 來把程式砍掉
但現在有一支程式不能刪...於是找了一些方式來過濾,語法如下



ps aux grep 關鍵字 grep -v grep awk '{print $2}'

但是這樣只會列出PID數字,還無法達成一行刪除,問了同事發現有個 xargs的好東西

所以要刪掉某個程式的所有 Process 的語法如下

ps aux grep 關鍵字 grep -v grep awk '{print $2}' xargs -L1 kill

這樣就會把前面 stdout 出來的 PID 數字,再倒給 kill 去砍囉~

參考資料: 一行刪除程式所有的 Process字串處理工具: Awk

由於有些程式會當掉,於是用了笨方法,每n小時就重啟
原本是用killall xxxx 來把程式砍掉
但現在有一支程式不能刪...於是找了一些方式來過濾,語法如下



ps aux grep 關鍵字 grep -v grep awk '{print $2}'

但是這樣只會列出PID數字,還無法達成一行刪除,問了同事發現有個 xargs的好東西

所以要刪掉某個程式的所有 Process 的語法如下

ps aux grep 關鍵字 grep -v grep awk '{print $2}' xargs -L1 kill

這樣就會把前面 stdout 出來的 PID 數字,再倒給 kill 去砍囉~

參考資料: 一行刪除程式所有的 Process字串處理工具: Awk

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 然後重開機就可以了