高見龍

iOS app/Ruby/Rails Developer & Instructor, 喜愛非主流的新玩具 :)

Postfix + Vm-pop3d

一般架設mail server,通常是在server上開立一個帳號(ex: useradd eddie),就差不多可以讓使用者來收發信件了。但一部電腦只設定一組domain name的mail,是有些浪費。但如果在同一台機器上要設定兩個以上不同domain name的email,上面這個方式就行不通了,但透過postfix的virtual alias table,還是可以做到這個功能的。

1. Postfix安裝

postfix網站可以找到下載點,有source也有包好的rpm,建議找rpm來安裝會比較順利。(版本可能會隨時間而有所改變)

> rpm -ivh postfix-2.1.5-4.rh9.i386.rpm

透過修改/etc/postfix/virtual,可以做到上面提到的功能,檔案內容如下:

eddie.com.tw       eddie
admin@eddie.com.tw   admin

這樣一來,寄給admin@eddie.com.tw的信,就會轉到本機admin這個帳號的信箱。但是,如果有另一個domain上也有相同的使用者,這個方式就行不通了,這時,就可以用vm-pop3d來做到多個domain信箱的設定。

2. vm-pop3d安裝

vm-pop3d網站也可以找到rpm安裝:

> rpm -ivh vm-pop3d-1.1.4-1.i386.rpm

安裝後需要改一下postfix的設定,修改/etc/postfix/main.cf的內容,加上下面這幾行:

virtual_mailbox_base = /home/virtual
virtual_mailbox_maps = hash:/etc/postfix/vmailbox
virtual_mailbox_domains = hash:/etc/postfix/vmaildomains
virtual_uid_maps = static:8
virtual_gid_maps = static:12
virtual_mailbox_lock = dotlock
virtual_minimum_uid = 8

接下來,要設定/etc/postfix/vmaildomains/etc/postfix/vmailbox這兩個檔案:

檔案 /etc/postfix/vmaildomains

eddie.com.tw     eddie
freebsd.com.tw    freebsd

檔案 /etc/postfix/vmailbox

eddie@eddie.com.tw   eddie.com.tw/eddie
eddie@freebsd.com.tw  freebsd.com.tw/eddie

再把這兩個檔案做成hash格式:

> postmap vmailbox
> postmap vmaildomains

然後,要為這些domain開一個資料夾,好像進來的信件可以分到這些相對應的目錄:

> mkdir -p /home/virtual/eddie.com.tw
> mkdir -p /home/virtual/freebsd.com.tw

再調整一下/home/virtual的權限:

> chown -R mail.mail /home/virtual
> chmod -R 775 /home/virtual

這樣信件才丟的進來。接下來,重新啟動postfix:

> postfix reload

這樣外面寄進來的信就會轉到個人的虛擬目錄下面了。因為vm-pop3d會去/var/spool/virtual這個資料夾裡抓信,但我是把virtual mail設定在/home下面,所以要加個link,不然會收不到信

> ln -s /home/virtual /var/spool/virtual

再來,就是要幫使用者設定密碼,vm-pop3d是利用apache裡的htpasswd這個工具來做密碼的,密碼檔要放在/etc/virtual/your.domains裡面,如果沒有/etc/virtual這個目錄,就自己建一個吧。就以我機器的例子:

> cd /etc/virtual/eddie.com.tw
> htpasswd -c passwd eddie
New password:
Re-type new password:
Adding password for user eddie

如此一來會產生一個叫做passwd的檔案,並把eddie及密碼寫在裡面。(如果要刪除使用者,直接用文字編輯器把那一行刪除就行了)

大致上這樣就ok了

測試:

> telnet localhost 110
Escape character is ‘^]’.
+OK POP3 Welcome to vm-pop3d 1.1.4 <26272.1109219984@mail.eddie.com.tw>
user eddie@eddie.com.tw
+OK
pass xxxxx
+OK opened mailbox for eddie
quit
+OK
Connection closed by foreign host.

看到這樣的訊息,就代表設定完成了。如果有什麼錯誤訊息,看一下/var/log/maillog裡面的東西應該可以找到問題。

要注意的是,一般email信箱如eddie@eddie.com.tw,是使用「@」前面的eddie當做使用者id來收信,但透過vm-pop3d,則是把整個eddie@eddie.com.tw都成使用者id,在其它收信軟體設定時要特別注意。

參考資料:

HOW TO Setup Postfix and vm-pop3d with virtual mailboxes

中文字處理的問題

最近在用sed處理中文資料的時候,發現經過處理後,有少數字會變成亂碼,後來才知道原來是locale沒設定好。

> echo ’65,3,”1111″,”謝婷雯”,”xxx@yahoo.com.tw’| sed ‘s/@/”,”/g’

結果得到:

65,3,”1111″,”謝?,”雯”,”xxx”,”yahoo.com.tw

我在自己帳號下的.bash_profile裡面加上LC_ALL=zh_TW.Big5之後:

> echo ’65,3,”1111″,”謝婷雯”,”xxx@yahoo.com.tw’| sed ‘s/@/”,”/g’

結果就是

65,3,”1111″,”謝婷雯”,”xxx”,”yahoo.com.tw

說明:

locale的環境變數設定有下列幾個:

  1. LC_CTYPE: 字元分類及處理方式。
  2. LC_COLLATE: 字元順序與字串比較。
  3. LC_MESSAGES: 程式中用何種語言來顯示訊息。
  4. LC_MONETARY: 貨幣顯式格式。
  5. LC_NUMERIC: 數字顯式格式。
  6. LC_TIME: 日期與時間的顯式格式。
  7. LC_ALL: 此類別可以一次設定以上所有的類別。
  8. LANG: 作用類似 LC_ALL,也可用來一次設定所有的 locale 環境。

使用locale這個程式可以看到目前locale的設定情形:

> locale
LANG=en_US.UTF-8
LC_CTYPE=”zh_TW.Big5″
LC_NUMERIC=”zh_TW.Big5″
LC_TIME=”zh_TW.Big5″
LC_COLLATE=”zh_TW.Big5″
LC_MONETARY=”zh_TW.Big5″
LC_MESSAGES=”zh_TW.Big5″
LC_PAPER=”zh_TW.Big5″
LC_NAME=”zh_TW.Big5″
LC_ADDRESS=”zh_TW.Big5″
LC_TELEPHONE=”zh_TW.Big5″
LC_MEASUREMENT=”zh_TW.Big5″
LC_IDENTIFICATION=”zh_TW.Big5″
LC_ALL=zh_TW.Big5

參考資料:

http://xcin.linux.org.tw/i18n/pc2000/p2/node4.html

APT(Advenced Package Tool)

APT(Advenced Package Tool),是Linux用來管理套件的工具,透過 APT可以更有效率的管理RPM,不管是安裝、移除、或是升級都很方便。然而APT最大的優點,是可以自動處理RPM相依性的問題,例如當安裝 A rpm,而A rpm和B rpm又有相依性的時候,原本作法是先下載B rpm安裝後,再下載A rpm安裝;利用APT則只需要「apt-get install A」就完成了,這樣 APT 就會幫我們下載A rpm,而且會自動下載相依性檔案(B rpm)幫我們安裝,這樣對 RPM 的安裝、移除、或是升級都可以不用去管煩人的相依性問題了。

安裝:

Step 1 安裝apt:

> rpm -ivh ftp://apt.nc.hcc.edu.tw/pub/freshrpms/redhat/9/apt/apt-0.5.5cnc6-fr1.i386.rpm

Step 2 修改設定:

>vi /etc/apt/sources.list

因為原本預設的apt source是連到國外,速度比較慢。

> rpm http://ayo.freshrpms.net/ fedora/linux/1/i386 core updates freshrpms

可以改成新竹縣教育研究發展暨網路中心維護的 APT Server:

> rpm ftp://apt.nc.hcc.edu.tw/pub/apt/redhat/9 i386 os updates freshrpms firefly extra

使用說明:

> apt-get update

更新:這是用來取得記錄在/etc/apt/sources.list內的apt伺服器的套件檔案清單,在使用apt-get dist-upgrade指令升級套件前,要記得先用這指令將套件檔案清單更新。

執行apt-get update指令的時候會同步client端和APT伺服器的RPM索引清單(package list),APT伺服器的RPM索引清單置於base資料夾內,使用者端電腦取得base資料夾內的bz2 RPM索引清單壓縮檔後,會將其解壓置放於/var/state/apt/lists/

> apt-get dist-upgrade

升級:這裡的升級,並不是由 Red Hat Linux 8.0 變成 9 這樣的升級,而是當 Red Hat 有出升級的 rpm 的時候,利用這個指令,升級我們已經安裝的 rpm;加上-y參數可自動回答yes直接安裝。

當使用者用 apt-get install 或 apt-get dist-upgrade 指令的時候,就會將 /var/state/apt/lists/ 資料夾內的資料和使用者端電腦內的 RPM 資料庫比對,如此一來就可以知道那些RPM已安裝、未安裝、或是可以升級的,然後APT 就會自動透過網路下載需要的rpm回來安裝了。

> apt-cache search

搜尋:用這個指令可以搜尋 rpm,例如:apt-cache search httpd,這樣檔名內有httpd字眼的rpm都會出現了。

> apt-cache depends

相依性:利用這個指令來看到某個 rpm 的所有相依性檔案,例如:apt-cache depends httpd,這樣 httpd 的所有相依性檔案就會出現了,有時候不確定某個相依性檔案是屬於那個 rpm 時,這個指令就很有用。

> apt-get install

安裝:當我們知道rpm名稱的時候,就可以用這指令安裝套件,例如:apt-get install httpd,這樣 apt 就會自動下載httpd的rpm回來安裝,若 httpd 有相依性套件的時候,apt也會自動下載安裝。

> apt-get clean

清除:當使用 apt-get install 指令安裝套件,下載下來的 rpm 會放置於 /var/cache/apt/archives,使用apt-get clean指令可以將之清除,避免佔用硬碟空間。

> apt-get remove

移除:如果要移除某個 rpm 的時候就可以使用此指令,例如:apt-get remove httpd,就會移除 httpd 了,假如這個 rpm 有相依性套件的時候,apt 也會一併移除。

另外,把apt寫成script排入每天的排程工作(/etc/cron.daily),就可以每天自動比對更新了:

#!/bin/sh
apt-get update
apt-get -y dist-upgrade
apt-get clean

參考網址:

http://apt.nc.hcc.edu.tw/web/apt/apt.html

Redirect and Pipe

什麼是redirect? 簡單的說,就是把目前所得的資料轉到其它地方。例如:

> ls -al > test

就會把ls -al所得到的資料,全部轉到test這個檔案。要注意的是,如果test檔案原本不存在,執行上面這個指令後,會建立一個新的檔案;如果test檔案已經存在,那上面這個指令就會把test檔案覆蓋掉!!

如果是這樣的話:

> ls -al >> test

兩個大於符號代表會把輸出的結果append到test檔案的最後面。

另外,輸出分成stdoutstderr兩種,stdout就是一般的輸出結果,當在輸入過程有遇到錯誤時,就會送到stderr,而1>2>分別就代表著stdout跟stderr,要注意數字跟大於符號之間沒有空格。

> ls -al 1> test 2> test.err

上面這行就是會把ls -al的結果輸出到test檔案,如果遇到錯誤的,就會導向test.err檔案。

redirect是雙向的,除了「>」,也有「<」,例如:

> mail -s “hello, eddie” eddie < /home/eddie/test

就是把這個test檔寄給指定的使用者。

> mysql -u root -p mydb < sql.txt

就是把檔案sql.txt裡面的sql語法,輸入到mysql裡的mydb資料庫。

而pipe(管線)跟redirect不太一樣,pipe能處理前一個指令傳來的輸出資訊,處理完後再丟給下一個指令(如果有的話)。例如下面這個指令:

> ps aux | grep java | more

意思就是說執行ps所輸出的結果,丟到grep裡面,然後grep會把含有java字串的那一行抓出來,grep再把結果輸出給more指令,如果grep輸出的結果超過一頁,more指令就會負責做分頁的動作。

差別:

> cat test | mail -s “hi” eddie

這個是會把test檔案的內容,輸出給mail程式,再寄出去。

> mail -s “hi” eddie < test

這個則是把test檔當作附加檔案寄出信件。

以上大致上是redirect跟pipe的介紹,這在很多地方都用得上,相信熟悉這些技巧將會對系統管理更得心應手。

Webmin安裝

Webmin是一套Web-based的系統管理軟體,原本複雜難記的指令,只透過瀏覽器就可以簡單的完成。不過,方便歸方便,該記的指令式還是要知道怎麼使用。

Step 1:下載Webmin

到Webmin網站http://www.webmin.com/,可以下載tar.gz或rpm格式的,如果是在linux環境下,下載rpm格式安裝會簡單很多。

Step 2:安裝Webmin

> rpm -ivh webmin-x.xxx-x.noarch.rpm

Step 3:使用Webmin

執行Step2安裝結束後,安裝訊息會告訴你使用網頁瀏覽器連到指定的位置,通常是http://localhost:10000/

第一次使用是以root的帳號密碼來登入,為了安全性的考量,建議第一次登入後新增一位跟root同等權限的使用者,然後把root帳號從Webmin系統 移除(對原系統沒影響,只是root不能使用webmin系統而已),另外,預設的port 10000也建議改到其它的port。

其實Webmin使用並不困難,例如上面提到使用者的新增、修改、更換port這些動作,相信都不難找到在哪裡做設定。

Enjoy it!!