2012年7月22日 星期日

sysctl.conf 相關設定


# Disables packet forwarding
net.ipv4.ip_forward = 1

# Enables source route verification
net.ipv4.conf.default.rp_filter = 1

# Disables the magic-sysrq key
kernel.sysrq = 0

#Sets the max system file descriptor limit to 500000
fs.file-max = 500000

#Sets the default Socket Listen Queue Length
net.ipv4.tcp_max_syn_backlog=12000

#sets min/default/max TCP read buffer (default 4096 87380 174760)
net.ipv4.tcp_rmem = 30000000 30000000 30000000
net.ipv4.tcp_wmem = 30000000 30000000 30000000
net.ipv4.tcp_mem = 30000000 30000000 30000000

#maximum receive socket buffer size  (Default 131071)
net.core.rmem_max = 10000000

#maximum send socket buffer size Default 131071)
net.core.wmem_max = 10000000

#default receive socket buffer size (Default 65535)
net.core.rmem_default = 10000000

#default send socket buffer size (Default 65535)
net.core.wmem_default = 10000000

#maximum amount of option memory buffers (Default 10240)
net.core.optmem_max = 10000000

#Define the local TCP ephemeral port range
net.ipv4.ip_local_port_range = 8192 65535

#Enable fast recycling of connections in the TIME_WAIT state
net.ipv4.tcp_tw_recycle = 1

#Maximum number of TIME_WAIT sockets held by the system simultaneously.
net.ipv4.tcp_max_tw_buckets = 2000000

#Number of unprocessed input packets before the kernel starts
#dropping them. (Default 10240).
net.core.netdev_max_backlog = 400000

# Adjusts the minimum number of entries to keep in the ARP cache.
# The garbage collector will not run if there  are  fewer than
# this number of entries in the cache.
#(Default 128)
net.ipv4.neigh.default.gc_thresh1 = 1024

#The  soft  maximum  number  of entries to keep in the ARP cache.
# The garbage collector will allow the number of entries to exceed
#this for 5 seconds before collection will be performed.
#(Default 128).
net.ipv4.neigh.default.gc_thresh2 = 1024

#The hard maximum number of entries to keep in the ARP cache.
# The garbage collector will always run if there are more than
#this number of entries in the cache.  (Default 512)
net.ipv4.neigh.default.gc_thresh3 = 2048

#The interval to do garbage collection on the arp table.
# (Defaults to 30).
net.ipv4.neigh.default.gc_interval = 3600

#When to time-out an arp table entry.  (Defaults 60).
net.ipv4.neigh.default.gc_stale_time = 3600

#When to time-out an arp table entry.  Do this for every NIC.
#  (Defaults to 60).
net.ipv4.neigh.eth0.gc_stale_time = 3600
net.ipv4.tcp_syncookies = 1

#
kernel.sem = 1000 256000 60 1024

# Share Memory
kernel.shmmni = 4096
kernel.shmall = 2097152
kernel.shmmax = 2147483647

# Per message Size
kernel.msgmnb = 11000000
kernel.msgmni = 3200
kernel.msgmax = 210000

# This causes the kernel to avoid using lower memory areas if address space is available in the high memory area.
vm.lower_zone_protection = 100

# Useful for debugging multi-threaded applications
kernel.core_uses_pid = 1

# Ignore ping the broadcast address of a network
net.ipv4.icmp_echo_ignore_broadcasts = 1

# Set this to ignore ICMP errors caused by hosts in the network reacting badly to frames sent to what they perceive to be the broadcast address.
net.ipv4.icmp_ignore_bogus_error_responses = 1

# Security Option
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.all.accept_redirects = 0

# Disables ICMP Redirect
net.ipv4.conf.all.send_redirects = 0

# Protect against wrapping sequence numbers
net.ipv4.tcp_timestamps = 0

# This setting determines the number of SYN+ACK packets sent before the kernel gives up on the connection.
net.ipv4.tcp_synack_retries = 2

# Time to hold socket in state FIN-WAIT-2, if it was closed by our side. Default value is 60sec
net.ipv4.tcp_fin_timeout = 5

# How many times to retry before deciding that something is wrong and it is necessary to report this suspicion to network layer. Minimal RFC value is 3, it is default
net.ipv4.tcp_retries1 = 3

# How many keepalive probes TCP will send, until it decides that the connection is broken. Default value: 9.
net.ipv4.tcp_keepalive_probes = 5

# How frequent probes are retransmitted, when a probe isn't acknowledged. Default: 75 seconds.
net.ipv4.tcp_keepalive_intvl = 15

# How often TCP sends out keepalive messages when keepalive is enabled. Default: 2hours
net.ipv4.tcp_keepalive_time = 60

# TCP/IP normally allows windows up to 65535 bytes big. For really fast networks, this may not be enough.
net.ipv4.tcp_window_scaling = 0

# Use Selective ACK which can be used to signify that specific packets are missing - therefore helping fast recovery.
net.ipv4.tcp_sack = 0

# Hidden
net.ipv4.conf.lo.arp_ignore=1
net.ipv4.conf.lo.arp_announce=2
net.ipv4.conf.all.arp_ignore=1
net.ipv4.conf.all.arp_announce=2

2012年7月19日 星期四

dbmail-2.0.11 + mysql

一般的mail server 不外乎是windows exchange server ,linux postfix or sendmail
M 系列的有版權,linux postfix sendmail 管理信件部份不方便~

dbmail + postfix + mysql 的搭配 是一個不錯給個人使用的mail server


os: Centos 4 or 5 以上
mysql: 5.x 以上,支援innodb 即可

Mysql Install : 方便使用Binary 的版本 ~方便


# groupadd mysql
# useradd -g mysql mysql
# Cd /usr/local/mysql
# scripts/mysql_install_db --user=mysql
# cp support-files/my-innodb-heavy-4G.cnf  /etc/my.cnf
# bin/mysqld_safe --user=mysql &
# ./bin/mysqladmin -u root password ‘XXXXXX’ (設定mysql 帳號root 密碼)
# ./bin/mysqladmin -u root -h ‘$hostname’ password 'XXXXXX'
# quit

安裝 DBmail (2.0.11)  官網 (目前版本至3.x)


     (a)安裝dbmail mysql schema
# cd dbmail-2.0.11
# /usr/local/mysql/bin/mysqladmin create dbmail -u root –p
# mysql -u root –p
# GRANT ALL ON *.* to dbmail@localhost identified by 'XXXXXX';
# quit
        # /usr/local/mysql/bin/mysql -u dbmail dbmail -p <               
  sql/mysql/create_tables_innoDB.mysql
     (b)安裝dbmail
                # cd dbmail-2.0.11
                # mkdir /usr/local/dbmail
               # PATH=$PATH:/usr/local/mysql/bin ./configure --prefix=/usr/local/dbmail/ --with-mysql=/usr/local/mysql
                # make
                # make install
                # cp dbmail.conf /etc/
                # vi /etc/dbmail.conf
                輪入hostuserpassdb
                # vi dbmail.conf /etc/


   測試dbmail 是否正常 (以新增user為例)


測試dbmail 是否正常 (以新增user為例)

(c)設定postfix for dbmail
                # vi /etc/postfix/main.cf
                # vi /etc/postfix/master.cf
              # vi /etc/postfix/transport (第一欄請填上所要接收的domain name)
.            # postmap /etc/postfix/transport (重新產生/etc/postfix/transport.db)
(d)測試postfix dbmail 是否正常運作
                1.啟動dbmail-deam
                # /usr/local/dbmail/sbin/dbmail-lmtpd
                # /usr/local/dbmail/sbin/dbmail-imapd
                # /usr/local/dbmail/sbin/dbmail-pop3d
                2.發測試信

安裝 MailScanner 
目的只是為了安全囉
解壓縮後
        # tar –zxvf MailScanner-4.71.10-1.rpm.tar.gz
        # cd MailScanner-4.71.10-1
        # ./install.sh
        # mkdir /var/spool/postfix/hold
# mkdir /var/spool/MailScanner/spamassassin
# chown postfix /var/spool/MailScanner/incoming
# chown postfix /var/spool/MailScanner/quarantine
# chown postfix /var/spool/MailScanner/spamassassin
# chown postfix /var/spool/postfix/hold
        設定MailScanner
        # vi /etc/MailScanner/MailScanner.conf
        修改
        %org-name% = xxx
        %org-long-name% = xxx
        %web-site% = www.xxxcom.tw
       Max Children (最多處理程序) = 10
        Run As User = postfix
        Run As Group = postfix
        Incoming Queue Dir = /var/spool/postfix/hold
Outgoing Queue Dir = /var/spool/postfix/incoming
MTA = postfix
Virus Scanning = no
Dangerous Content Scanning = no
Spam Score Character = *
Always Include SpamAssassin Report = yes
Hostname = spamassin
Notify Senders = no
Notify Senders Of Blocked Filenames Or Filetypes = no
Spam Subject Text = ***Spam From xxxAdmin***
High Scoring Spam Subject Text = ***Spam From xxxAdmin***
Attachment Encoding Charset = big5
High Scoring Spam Actions = deliver header "X-Spam-Status: Yes"
SpamAssassin User State Dir =/var/spool/MailScanner/spamassassin
MCP Checks = yes
# vi /etc/MailScanner/ruel/spam.whitelist.rules (設定白名單)


# vi /etc/MailScanner/spam.assassin.prefs.conf
        ok_locales             zh en
        use_bayes 1
        bayes_path /var/spool/MailScanner/spamassassin/
bayes_file_mode 0644
bayes_auto_learn 1
use_pyzor    1
ifplugin Mail::SpamAssassin::Plugin::Pyzor
pyzor_path /usr/bin/pyzor
endif

安裝 Pyzor
# cd spam_source
# cd pyzor-0.4.0
# python setup.py build
#python setup.py install
#chmod -R a+rX /usr/share/doc/pyzor /usr/lib/python2.3/site-packages/pyzor   /usr/bin/pyzor /usr/bin/pyzord

設定spamassassin rule
        # cd /etc/mail/spamassassin
        # mv local.cf local.cf.bak
        # ln -s /etc/MailScanner/spam.assassin.prefs.conf local.cf
        # cp spam_rule/*.cf /etc/mail/spamassassin/
設定postfix for mailscan
        # vi /etc/postfix/main.cf
        加上 header_checks = regexp:/etc/postfix/header_checks
        # vi /etc/postfix/header_checks
加上 /^Received:/ HOLD
啟動MailScanner
        #chkconfig --levels 2345 sendmail off
# chkconfig --levels 2345 MailScanner on
# chkconfig --levels 2345 spamassassin on
# /etc/init.d/spamassassin start
# /etc/init.d/MailScanner restart

啟動mailscanner 會順帶起postfix 服務
測試
Postfix收到信件後會先hold /var/spool/postfix/hold 並呼叫Mailscanner 來處理
依照MailScanner 只做spam動作而不做掃毒,完成後在丟回給postfix ,最後postfix pipe
dbmail-lmtp 存取至DB


前端呈線頁可以自己寫去接lmtp 或是使用 squirrelmail






2012年7月18日 星期三

分析 web access log 計算 IP 次數

如題: 只是為了計算來源IP的次數與統計

awk '{name[$1]++ }; END {for (count in name) print count,name[count]}' |sort -k 2 -nr $LOGFILE




Portsentry How to


Portsentry is free software: 有興趣的人可以玩玩看

一、說明
        針對主機被掃Port的動作,自動發警告通知信以判斷來源及作後續處置
二、安裝 Portsentry


1. 下載   http://sourceforge.net/projects/sentrytools/
2. 安裝
        (1)  ##### vi portsentry.c#####


將 1584 和 1585 行合併為一行, 如下:


printf ("Copyright 1997-2003 Craig H. Rowland <craigrowland at users dot sourceforget dot net>\n");      
        (2)  編譯及安裝
# make linux


# make install


預設安裝於 /usr/local/psionic/portsentry


3. 設定
                  ##### portsentry.conf #####


                  TCP_PORTS="1"                                         # 以 ADVANCED Mode 啟動時會忽略的 TCP Port
                  UDP_PORTS="1"                                                # 以 ADVANCED Mode 啟動時會忽略的 UDP Port
ADVANCED_EXCLUDE_TCP=” 123”     # 排除 NTP
ADVANCED_EXCLUDE_UDP=” 123,137,138”      # 排除 NTP,Samba
                  IGNORE_FILE=" /usr/local/psionic/portsentry/portsentry.ignore"              # 不 Block 的來源位置
                  HISTORY_FILE=" /usr/local/psionic/portsentry/portsentry.history"           # Block 紀錄
                  BLOCKED_FILE=" /usr/local/psionic/portsentry/portsentry.blocked"       # Block 暫存檔
                  RESOLVE_HOST = "0"                                                      # 不將 Block 的來源做 DNS 反解析
                  BLOCK_UDP="2"                                                               # TCP Block為執行 KILL_RUN_CMD
                  BLOCK_TCP="2"                                                                # UDP Block為執行 KILL_RUN_CMD
                  KILL_RUN_CMD="/script/portsentry.sh mail $TARGET$"      # 呼叫外部Script發Alert Mail
4. KILL_RUN_CMD 呼叫的 Script
##### /script/portsentry.sh #####


#!/bin/sh


HOSTNAME=`hostname -s`
TIME=`date '+%Y%m%d'`
MAILTO="xxxx@abc.com"


case $ 1 in


start)
        /usr/local/psionic/portsentry/portsentry -atcp
        /usr/local/psionic/portsentry/portsentry -audp
;;
stop)
        killall -9 portsentry
;;
mail)
        echo $TIME | /bin/mail -s "$HOSTNAME Had Detect Port Scan From $2" $MAILTO
;;
init)
        rm -f /usr/local/psionic/portsentry/portsentry.blocked*
;;
*)
        echo "Please Usage start|stop|mail|init"
;;


Esac


5. 排程刪除 Block 暫存檔,避免已列入檔案的來源不會再執行Alert
##### /etc/crontab #####


* * * * * root /script/portsentry.sh init
6. 開機啟動
##### /etc/rc.local #####


              /script/portsentry.sh start

cron的一些細節研究


原因:機器每天凌晨01:00和04:00 CPU占用率100,是cron.daily的原因。修改下。
$ cat crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
/etc/cron.deny文件就是用於控制不讓哪些用戶使用Crontab的功能。


另外在/var/spool下面存在著二個目錄cron,anacron。
其中cron目錄下面有每個用戶的透過crontab -e增加的crontab的內容。

anacron目錄下面是記錄的是cron.daily,cron.monthly,cron.weekly的上一次執行的時間。
linux的cron服務是每隔一分鍾去讀取一次/var/spool/cron,/etc/crontab,/etc/cron.d下面所有的內容。

在linux系統上,默認情況下在/etc/cron.daily目錄下面存在以下文件:
-rwxr-xr-x 1 root root 286 Aug 14 2004 tmpwatch
-rwxr-xr-x 1 root root 276 Sep 29 2004 0anacron
-rwxr-xr-x 1 root root 2133 Dec 1 2004 prelink
-rwxr-xr-x 1 root root 180 Jul 13 2005 logrotate
-rwxr-xr-x 1 root root 121 Aug 9 2005 slocate.cron
-rwxr-xr-x 1 root root 48 Apr 10 2006 mcelog.cron
-rwxr-xr-x 1 root root 418 Apr 14 2006 00-makewhatis.cron
-rwxr-xr-x 1 root root 104 May 31 2006 rpm
lrwxrwxrwx 1 root root 28 Apr 7 08:25 00-logwatch -> ../log.d/scripts/logwatch.pl

這裡有些東西是很耗資源的,可以考慮去掉:
tmpwatch的作用是清除掉一些長時間沒有訪問的過時文件。這個留著。
0anacron的作用是更新crontab job的執行時間,這個必須要留著。它在名稱的前面另上0,以保證這個程序會在
其他程序前執行。並且這個被run-parts自動調用。

prelink的作用是預連接一些動態連接庫和可執行文件,以此來加快啟動時間和?少run-time的內存分配,有點類似於oracle
的dbms_shared_pool.keep的作用一樣。這個東西是個雙刃劍。

logrotate的作用循環利用,壓縮一些系統日誌的,還是留著。

slocate.cron的作用更新slocate database,用於為locate服務的,很消耗資源,可以停掉。

mcelog.cron的作用是用於生成/var/log/mcelog文件,留著。

00-makewhatis.cron的作用是創建whatis database,用於為whatis服務的。較為消耗資源,可以去掉。
這個在cron.weekly裡面也存在,這裡面的也可以去掉。

rmp的作用是每天將系?上安?過的rpm包的信息放到/var/log/rpmpkgs中去。這個也沒什麼用處,可以去掉。

00-logwatch 的作用是用於監控linux log文件的。可以留著。

----------------------------------------------------
/etc/cron.daily/slocate.cron:

許多 LinuxR 系統都有一個稱為 /etc/cron.daily/slocate.cron 的文件,它每天都會運行磁盤密集型的 dbupdate 程序。這個程序允許您使用 locate 命令來代替 find 命令,以執行查找文件的工作。如果您從來都不使用 locate 命令,那麼您可以對 /etc/cron.daily/slocate.cron 文件進行編輯,以使 dbupdate 程序不以超級用戶的身份運行,啟動最常用的編輯器,並且註譯其中的指令。

Shell Script 搜尋出檔案,產生出清單後,對照另個清單動作

搜尋出檔案,產生出清單後,一比一比,對照另個清單動作(mv)

=======================分格線==========================


#!/bin/bash

backerno=( $@ ) ;
path_source="/data/mail/mailpool/" ;
dest="/data/mail/dest" ;
yahoodest="/data/mail/yahoodest"
dest_no=`cat $dest |wc -l` ;
yahoodest_no=`cat $yahoodest|wc -l`
yahoolist="/opt/logs/yahoo`date +%Y%m%d_%H_%M`_${backerno[0]}_$RANDOM"
filelist="/dev/shm/`date +%Y%m%d_%H_%M`_${backerno[0]}_$RANDOM"

create_list ()
        {
                if [ ${#backerno[*]}  -eq 0 ];then
                        echo "Userage: cmd <backer> <backer>"
                else
                        si=0;
                        while [ $si -lt ${#backerno[*]}  ]
                        do
                        echo ${backerno[$si]} create list done ;
                        #find $path_source${backerno[$si]} -name '*.?mail' |head -2000 |xargs grep -i "^To.*@yahoo.*" | awk -F ':' '{print $1}' >> $yahoolist     --> 此行是當初要抓出,要寄到yahoo信件所做的分?
                        find $path_source${backerno[$si]} -name '*.?mail' |head -800 | awk -F ':' '{print $1}' >> $filelist
                        #find $path_source${backerno[$si]} -name '*.?mail' -print >> $filelist
                                si=`expr $si + 1`;
                        done
                fi
        }

random_send ()
        {
                destogo=`awk 'NR=='$i'' $dest`
                mv -f $@ $destogo  
                i=`expr $i + 1 `        }

yahoo_send ()
        {
                destogo=`awk 'NR=='$i'' $yahoodest`
                mv -f $@ $destogo
                #echo  $@    ==== $destogo
                #echo "$@ move to $destogo"
                i=`expr $i + 1 `        }

random_main ()
        {
                i=1
                for file in `cat $filelist`
                        do
                                if [ $i -gt $dest_no ];then
                                i=1
                                random_send $file
                        else
                                random_send $file
                        fi
                done        }

yahoo_main ()
        {
                i=1
                for file in `cat $yahoolist`
                        do
                                if [ $i -gt $yahoodest_no ];then
                                i=1
                                yahoo_send $file
                        else
                                yahoo_send $file
                        fi
                done        }

x=1;
while [ $x -ge 1 ]
        do
                starttime=`date +'%Y%m%d %T'`
                perstart=`date +%s`
                create_list
                echo $filelist
                random_main
                perstop=`date +%s`
                tvalue=`expr $perstop - $perstart`
                totalfiles=`cat $filelist |wc -l`
                pervalue=`expr $totalfiles / $tvalue `
                echo  "Start at $starttime  done at `date +'%Y%m%d %T'` moved $totalfiles files in $pervalue per/sec" >> /data/mail/log/${backerno[0]}${backerno[1]}.log;
                rm -rf $filelist ;
                sleep 60;
done

Unison file-synchronization tool SOP


Unison file-synchronization tool SOP


1.       下載相關套件 (請注意OS版本)
OCaml compiler : http://caml.inria.fr/download.en.html
Unison : http://www.cis.upenn.edu/~bcpierce/unison/download.html

2.       安裝套件 (unison若為使用同一份source,請先執行make clean)
OCaml compiler : 直接RPM安裝即可

Unison : 解TAR之後修改Makefile下的INSTALLDIR = /usr/local/unison/bin/
修改完後存檔離開,先建立資料夾mkdir –p /usr/local/unison/bin/,建立資料夾後直接make;make install

※     /usr/local/unison/bin/資料夾要自行手動建立,程式不會自動產生,注意Makefile的路徑後面不要有空格,否則make install時會出現錯誤,檢查方式為/usr/local/unison/bin/下若只有一個檔案,表示Makefile的路徑有問題,造成檔案無法正常複製到路徑下

3.       copy script範本並修改

Script內容 (注意紅字部分的修改,每個網站不同)
#!/bin/bash

DATE=`date +'%Y%m%d'`
TIME=`date +'%H%M'`
HOSTNAME=`hostname -a | tr -d " "`
REMOTE_DIR=/pda
LOCALHD=/backuphd/pdawb
HOME=/root
LOG=/var/log/unison.log
SNAPSHOT=/backuphd/pdawb/.snapshot/$DATE/$TIME
UNISON=/usr/local/unison/bin/unison
OLDDATE=`date -d '7 day ago' +%Y%m%d`
OLDSNAPSHOT=/backuphd/pdawb/.snapshot/$OLDDATE
DU=`du -s -h $LOCALHD`

##### Create Snapshot Directory
if [ ! -d "$SNAPSHOT" ];then
    mkdir -p $SNAPSHOT
fi
##### Create Snapshot
TIME=`date +'%Y%m%d %H:%M:%S'`
echo "Start Create Snapshot at $TIME" > $LOG
cp -apl $LOCALHD/* $SNAPSHOT
TIME=`date +'%Y%m%d %H:%M:%S'`
echo " " >> $LOG
echo "Create Snapshot Done at $TIME" >> $LOG
echo " " >> $LOG
##### run unison
echo "Change File List: " >> $LOG
$UNISON -silent -batch -owner -group -times $REMOTE_DIR $LOCALHD -force $REMOTE_DIR -logfile $LOG >> /var/log/messages 2>&1
echo " " >> $LOG
#####delete old snapshut
rm -rf $OLDSNAPSHOT
##### check backup status
DATE=`date +'%Y%m%d'`
TIME=`date +'%Y%m%d %H:%M:%S'`
TIME1=`date +'%H%M'`
FOLDERPATH=/backuphd/pdawb/.snapshot/$DATE
FOLDERLIST=`ls -lh /backuphd/pdawb/.snapshot/$DATE/ | awk '{print $6,$7,$8,$9}'`
echo "Folder List: " >> $LOG
ls -lh $LOCALHD | awk '{print $5"\t"$6"\t"$7"\t"$8"\t"$9}' >> $LOG
echo " " >> $LOG
echo "Total Usage: $DU" >> $LOG
echo " " >> $LOG
echo "Unison Done at $TIME" >> $LOG
echo " " >> $LOG
echo "Check Folder Path : $FOLDERPATH" >> $LOG
echo " " >> $LOG
echo "Check Folder List :" >> $LOG
echo "$FOLDERLIST" >> $LOG
##### mail to
HOURSET=`date +'%H'`
TIME=`date +'%Y%m%d-%H:%M:%S'`
MAILLIST= "XXXX@XXX.XXX"
if [ $HOURSET -eq 4 ] || [ $HOURSET -eq 8 ] || [ $HOURSET -eq 12 ] || [ $HOURSET -eq 16 ] || [ $HOURSET -eq 20 ] || [ $HOURSET -eq 00 ]; then
   mail -s ''$HOSTNAME' unison Backup Status-'$TIME'' $MAILLIST < $LOG
fi

修改完畢存檔後建立備份資料夾 mkdir /backuphd/pdawb
並手動執行一次unison,讓/root/.unison/default.prf產生

執行完畢之後,編輯/root/.unison/default.prf,加入要排除的資料夾
ex:
        ignore = Name {.snapshot}
        ignore = Name {public}


修改完畢後,手動執行一次unison,做第一次同步
/usr/local/unison/bin/unison -batch -owner -group -times /pda /backuphd/pdawb -force /pda -logfile /var/log/unison.log
語法:
/usr/local/unison/bin/unison -batch -owner -group -times /pda /backuphd/pdawb -force /pda -logfile /var/log/unison.log
Unison command [預設回應] [同步onwer權限] [同步group權限] [同步檔案時間] [遠端資料夾] [目的資料夾] [強制設定來源] [log檔案路徑]

加入crontab,重啟service


注意事項:
1.       若不指定執行時的profile,unison預設會採用/root/.unison/default.prf當成profile,若有多個資料夾要備份,可編輯不同的profile,執行時加入profile name即可,此處以managermx為範例說明,請注意紅字部分

#!/bin/bash
DATE=`date +'%Y%m%d'`
TIME=`date +'%H%M'`
HOSTNAME=`hostname -a | tr -d " "`
REMOTE_DIR=/manager
LOCALHD=/backuphd/manager
HOME=/root
PROFILE=manager.prf
LOG=/var/log/unison-manager.log
SNAPSHOT=/backuphd/manager/.snapshot/$DATE/$TIME
UNISON=/usr/local/unison/bin/unison
OLDDATE=`date -d '7 day ago' +%Y%m%d`
OLDSNAPSHOT=/backuphd/manager/.snapshot/$OLDDATE
DU=`du -s -h $LOCALHD`
##### Create Snapshot Directory
if [ ! -d "$SNAPSHOT" ];then
    mkdir -p $SNAPSHOT
fi
##### Create Snapshot
TIME=`date +'%Y%m%d %H:%M:%S'`
echo "Start Create Snapshot at $TIME" > $LOG
cp -apl $LOCALHD/* $SNAPSHOT
TIME=`date +'%Y%m%d %H:%M:%S'`
echo " " >> $LOG
echo "Create Snapshot Done at $TIME" >> $LOG
echo " " >> $LOG
##### run unison
echo "Change File List: " >> $LOG
$UNISON $PROFILE -silent -batch -owner -group -times $REMOTE_DIR $LOCALHD -force $REMOTE_DIR -logfile $LOG >> /var/log/messages 2>&1
echo " " >> $LOG

Tomcat 5.0/5.5 with SSL + cluster + load balance


Tomcat 5.0/5.5 with SSL + cluster + load balance


Tomcat 5.0/5.5 with SSL + cluster + load balance

Tomcat如果作cluster的話,通常都會同時配合load balance的方案。而Tomcat的load balance解決方案,最多人用的是利用apache http server搭配jk module來當Tomcat前端的load balance server。不過在網路上查到的大多是apache http server與tomcat都走http protocol的設置說明。如果tomcat要走https的話,前端當load balance的apache http server當然也一定要走https才行。但是這部份的文件實在是少的不行,讓人很...囧rz

以下是自己試過後確定可以同時讓tomcat與前端load balance的apache http server都可以走https的設置方式,有需要的可以參考一下

1.安裝軟體清單
linux AS 4U4
N個Tomcat 5.0/5.5 (N >= 2)
Apache HTTP Server 2.2.4 with SSL version
JK module for Apache HTTP Server 2.2.4

2.Tomcat with SSL
2.1 官方文件
http://tomcat.apache.org/tomcat-5.0-doc/ssl-howto.html (for Tomcat 5.0)
http://tomcat.apache.org/tomcat-5.5-doc/ssl-howto.html (for Tomcat 5.5)

2.2 設置方式
step1 : 在Console執行%JAVA_HOME%\bin\keytool -genkey -alias tomcat -keyalg RSA指令,將password的值設成changeit
step2 : 將$CATALINA_HOME/conf/server.xml中的<!-- Define a SSL Coyote HTTP/1.1 Connector on port 8443 -->的comment給拿掉


3.Tomcat with cluster
3.1 官方文件
http://tomcat.apache.org/tomcat-5.0-doc/cluster-howto.html (for Tomcat 5.0)
http://tomcat.apache.org/tomcat-5.5-doc/cluster-howto.html (for Tomcat 5.5)

3.2 設置方式
Step1 : 將要做cluster的所有Tomcat APServer裡$CATALINA_HOME/conf/server.xml中的<Cluster>...</Cluster>的comment給拿掉,在<Engine>tag中加入jvmRoute="你指定的woker"此項attribute
Step2 : 要做cluster的所有Tomcat APServer用的multicast address,multicast port都要相同

3.3 注意事項
3.3.1 如果是同台Server上裝多個Tomcat的話必需要把下列的几個Port調開
Server port
non-SSL Coyote HTTP/1.1 Connector port
SSL Coyote HTTP/1.1 Connector port
Coyote/JK2 AJP 1.3 Connector on port
Cluster tcpListenPort

3.3.2 存放在HttpSession的Object都必需實作java.io.Serializable Interface

3.3.3 可用下列jsp文檔進行測試,測成功的話不同url取回的session id值會相同

<%@ page contentType="text/html; charset=UTF-8" import="java.util.*"%>
<html>
<head>
<title>Cluster App Test</title>
</head>
<body>
Server Info:
<% out.print(request.getLocalAddr() + " : " + request.getLocalPort()); %>
<% out.println("<br> ID " + session.getId());   // 如果有新的 Session 屬性設置 String dataName = request.getParameter("dataName");
if (dataName != null && dataName.length() > 0) { String dataValue = request.getParameter("dataValue"); session.setAttribute(dataName, dataValue); }
out.print("<b>Session 列表</b>");
Enumeration e = session.getAttributeNames();
while (e.hasMoreElements())
{ String name = (String) e.nextElement(); String value = session.getAttribute(name).toString(); out.println(name + " = " + value); } %>
 <form action="index.jsp" method="POST"> 名稱:<input type=text size=20 name="dataName"> <br> 值:<input type=text size=20 name="dataValue"> <br> <input type=submit>
</form>
</body>
</html>

4.Tomcat with load balance
4.1 官方文件
http://tomcat.apache.org/tomcat-5.0-doc/balancer-howto.html (for Tomcat 5.0)
http://tomcat.apache.org/tomcat-5.5-doc/balancer-howto.html (for Tomcat 5.5)


4.2 設置方式
Step1 : 將ApacheHttpServer安裝目錄/conf/httpd.conf加入下述設定片段

#(httpd.conf) #載入 mod_jk 模組
LoadModule jk_module modules/mod_jk.so
JkWorkersFile conf/workers.properties

            # Where to put jk logs

            JkLogFile logs/mod_jk.log
# Set the jk log level [debug/error/info]

            JkLogLevel error
JkRequestLogFormat     "%w %V %T %U %q"
# Add the jkstatus mount point

            JkMount /jkmanager/* jkstatus
# # Configure mod_jk #                                                                                                                
 <Location /jkmanager>
JkMount jkstatus Order deny,allow
Deny from all
Allow from 127.0.0.1
</Location>

Step2 : 在ApacheHttpServer安裝目錄/conf中加入workers.properties文字檔,該檔的設置可參考下述範例(記的改host跟port的值以符合實際的狀況)

# The advanced router LB worker
worker.list=router,jkstatus
# Define a worker using ajp13
worker.worker1.port=8009
worker.worker1.host=localhost
worker.worker1.type=ajp13
worker.worker1.lbfactor=1
# Define prefered failover node for worker1
#worker.worker1.redirect=worker2
# Define another worker using ajp13
worker.worker2.port=9009
worker.worker2.host=localhost
worker.worker2.type=ajp13
worker.worker2.lbfactor=1
# Disable worker2 for all requests except failover
#worker.worker2.activation=disabled
# Define the LB worker
worker.router.type=lb
worker.router.balance_workers=worker1,worker2
# Define a 'jkstatus' worker using status
worker.jkstatus.type=status

Step3 : 在ApacheHttpServer安裝目錄/conf中加入uriworkermap.properties文字檔,該檔的設置可參考下述範例

/*=router
/jkmanager=jkstatus

4.3 load balance監控方式
在安裝balance程式的那台電腦本機利用browser開啟http://localhost/jkmanager進行監控


5.Apache HTTP Server with SSL
5.1 設置方式
Step1 : 將ApacheHttpServer安裝目錄/conf/httpd.conf裡的LoadModule ssl_module modules/mod_ssl.so的comment給拿掉

Step2 : 將ApacheHttpServer安裝目錄/conf/httpd.conf裡的Include conf/extra/httpd-ssl.conf的comment給拿掉

Step3 : 產生CA相關憑証
在Console中切換到ApacheHttpServer安裝目錄/bin路徑
在Console中執行openssl req -config ../conf/openssl.cnf -new -out ../conf/server.csr,並輸入自己指定的密碼
在Console中執行openssl rsa -in privkey.pem -out ../conf/server.key,並輸入剛剛自己指定的那組密碼
在Console中執行openssl x509 -in ../conf/server.csr -out ../conf/server.crt -req -signkey ../conf/server.key -days 3650
在Console中執行openssl x509 -in ../conf/server.crt -out ../conf/server.der.crt -outform DER

有關Step3寫的產生憑証設定,我是看的很頭大不確定這樣設置所產生的憑証有沒有問題,有高人知道怎麼設最安全的話,麻煩指點一下...<(_ _)>

6.補充事項
6.1 如果想讓User只能經由HTTPS的連線連至Tomcat,可以改下述設定
將ApacheHttpServer安裝目錄/conf/httpd.conf裡的Listen 80給comment起來
將$CATALINA_HOME/conf/server.xml中的<!-- Define a non-SSL HTTP/1.1 Connector on port 8080 -->那段設定給comment起來

6.2 Tomcat的cluster是利用multicast的方式達成,要做cluster的Tomcat APServer最好在同個switch的網段內,否則cluster很可能會失效。因為有可能跨switch後multicast就送不出去了。

7.參考文檔
http://zanyking.java.pro/post/23/81
http://www.ibm.com/developerworks/cn/opensource/os-lo-apache-tomcat/index.html
http://httpd.apache.org/docs/2.2/ssl/ssl_howto.html
http://www.pczone.com.tw/vbb3/thread/47/96241/
http://www.pczone.com.tw/vbb3/thread/47/96447/
http://xiaoant.blog.sohu.com/40503251.html


vi 與 vim 的指令整理


vi 是 unix 家族下最功能強大的文字編輯器,讓用戶只要使用一個鍵盤就可以完成所有的編輯。而 vim 則是 vi 的加強版,甚至在 Windows 上也找得到 vim 的芳蹤。但 vi/vim 眾多的指令卻經常令初學者卻步,以下就是我所整理出來那些令人卻步的指令:


指令 說明
i 在游標位置進入編輯模式
I 在游標行的第一個非空白字元進入編輯模式
a 在游標位置後進入編輯模式
A 在游標行的最後一個字元進入編輯模式
o 向下新增一行,並進入編輯模式
O 向上新增一行,並進入編輯模式
cc 刪除游標行,並進入編輯模式
[ESC] 取消指令或退出編輯模式
游標移動

指令 說明
gg 移到第一行
G 移到最後一行
行數 → G 移動到第 n 行
0 移動到該行最前面
$ 移動到該行最後面
字數 → [Space] 向右移動 n 個字元
行數 → [Enter] 向下移動 n 行 <h3>標記與複製</h3>
指令 說明
v 開始字串標記
V 開始行標記
v → [Ctrl]-V 開始區塊標記
d 刪除標記的內容
y 複製標記的內容
yy 複製游標行
yG 複製游標行到最後一行
y1G 複製游標行到第一行
y$ 複製游標處到最後一個字元
y0 複製游標處到第一個字元
p 在下一行貼上複製或刪除的內容
P 在上一行貼上複製或刪除的內容
[Ctrl]-R → 0 在下一行貼上複製或刪除的內容,適用於編輯模式及指令行 <h3>搜尋與取代</h3>
指令 說明
/搜尋字串 向下搜尋字串
* 將游標移到字串上,直接按 “*” 也可以做向下搜尋
?搜尋字串 向上搜尋字串
:set ic 搜尋時不分大小寫
:set noic 搜尋時要分大小寫
n 繼續下一個搜尋結果
N 繼續上一個搜尋結果
:起始行,終止行s/搜尋字串/取代字串/gic 從第 n 行到第 n 行取代字串 (後面的 g: 整行全部, i: 不分大小寫,


c: 詢問)

:1,$s/搜尋字串/取代字串/gic 全部取代字串 (後面的 g: 整行全部, i: 不分大小寫,
c: 詢問) <h3>刪除</h3>
指令 說明
dd 刪除游標行
dG 刪除游標行到最後一行
d1G 刪除游標行到第一行
d$ 刪除游標處到最後一個字元
d0 刪除游標處到第一個字元 <h3>檔案功能</h3>
指令 說明
:w 存檔 (加 ! 表示強制存檔)
:w 檔案名稱 另存新檔
:wq 存檔並退出 vi
:e 檔案名稱 編輯其它檔案
:e! 還原至檔案編修前的狀態
:r 檔案名稱 讀入檔案內容,並加到游標行的後面
:n 切換到下一個開啟的檔案
:N 切換到上一個開啟的檔案
:set nu 顯示行號
:set nonu 取消行號顯示
:files 列出所有開啟的檔案 <h3>視窗分割</h3>
指令 說明
:new 新增水平視窗
:new 檔案名稱 新增水平視窗,並在新增的視窗載入檔案
:vnew 新增垂直視窗
:vnew 檔案名稱 新增垂直視窗,並在新增的視窗載入檔案
[Ctrl]-W → [方向鍵] 切換視窗
:only 僅保留目前的視窗 <h3>其它</h3>
指令 說明
J 將游標行與下一行合併
u 還原指令
[Ctrl]-R 重做指令
. 重覆上一個指令
! 命令 執行 linux 指令,並顯示執行結果
:q 退出 vi (加 ! 表示強制退出) <h3>vim 的設定檔</h3>
通常我會編輯 /etc/vimrc,在檔案最後加入:

" 顯示列號
    set number
    " 語法高亮度顯示
    syntax on
    " 標記搜尋到的字串
    set hlsearch
    " 自動縮排
    set autoindent
    " 顯示說明
    set ruler
    " 顯示編輯狀態
    set showmode
    " 設定註解的顏色
    highlight Comment ctermfg=cyan
    " 設定搜尋到的字串顏色
    highlight Search term=reverse ctermbg=4 ctermfg=7
    " 設定 tab 鍵的字元數
    set tabstop=4


好用的 netcat 指令


netcat 就像 cat 指令一樣,只是將簡單的 cat 功能完全「網路化」,好用與靈活的程度可說是很驚人,而在 Top 100 Network Security Tools 排行榜中還排行第四名呢!

netcat 除了可以當 TCP Client 工具以外,還可以當 TCP Server 的工具,以下我用幾個簡單的例子說明:

示範 netcat 如何當 TCP Client 工具

底下這段指令代表你要將 /etc 目錄整個打包並壓縮起來,並將資料傳送到 10.0.0.99 主機的 Port 3456,並指定若超過 30 秒沒有連上目的地或 30 秒沒有回應的話自動 Timeout。

# tar -zcf - /etc | netcat -w 30 10.0.0.99 3456
示範 netcat 如何當 TCP Server 工具

如果拿以上的例子,你可能會想說那你還要自己寫一個 Server 接受這些封包啊!答案是:「只要用 netcat 就可以拿來當 Server 用了,一行程式也不用寫」,底下這段指令是假設從 10.0.0.99 主機執行的。

# netcat -l -p 3456 > /backup/my_etc_backup.tar.gz
-l 參數代表進入 Listen mode

-p 代表 Listen 的 Port 為 3456

之後的 > my_etc_backup.tar.gz 代表你要將從 TCP 傳入的所有資料都導入到 /backup/my_etc_backup.tar.gz 檔案中。

用以上兩個非常簡單的例子就可以知道,原來在網路之間傳輸資料可以如此的簡單。若知道 rsync 工具的人可能會笑說:「用 netcat 太麻煩了吧,用 rsync 同步或備份檔案才更好用吧」。是的,如果要「同步檔案」的話,當然用 rsync 比較好用,不過 netcat 還可以做的更多!

因為 netcat 可以模擬任何所有 TCP Protocol 的動作,就如同我們常用 telnet 測試 HTTP、POP3、或 SMTP 協定的時候一樣,只是使用 netcat 可以讓我們更自動化的做些測試,舉幾個例子如下:

1. 測試 HTTP 運作是否正常

首先,必須先建立要下的 HTTP 指令檔,假設叫 GET_tw.yahoo.com.txt,內容如下:

GET / HTTP/1.0
Host: tw.yahoo.com
注意:在指令的最後面必須要有兩個「斷行」符號,所以你可以在文字檔後面加上兩行空白行。

然後就可以用以下指令取得 Yahoo! 奇摩 的首頁 HTML:

# cat GET_tw.yahoo.com.txt | nc tw.yahoo.com 80
再透過一些指令或程式就可以將測試網頁是否還活著的偵測程式完成且自動化了。

2. 測試 SMTP 運作是否正常

測試 SMTP 的方式也跟 HTTP 一樣,就是先把指令都給先寫好,假設檔名是 SMTP_test.txt,內容如下:

HELO localhost
MAIL FROM:<will@test.com>
RCPT TO:<will@test.com>
DATA
To: Will <will@test.com>
Subject: This is a test
This is first line
.
QUIT
然後就可以用以下指令將 SMTP Command 送到 smtp.test.com 了:

#  cat SMTP_test.txt | nc smtp.test.com 25
執行的結果如下:

# cat SMTP_test.txt | nc smtp.test.com 25
220 smtp.test.com ESMTP Service ready Fri, 11 Jul 2008 19:13:17 +0800 (CST)
250 smtp.test.com
250 Sender <doggy@test.com> OK
250 Recipient <doggy@test.com> OK
354 Enter mail, end <CRLF>.<CRLF>
250 Message accepted for delivery
221 smtp.test.com

如何讓 tomcat 支援 WMA


解壓後的tomcat 預設是不支援 wma 檔的
只需要在 tomcat/conf/web.xml 加入
   <mime-mapping>
        <extension>wma</extension>
        <mime-type>audio/x-wma</mime-type>
    </mime-mapping>
重啟後即可...

引數列項目過長?什麼鬼


引數列項目過長

查了一下好像是系統限制,處理的檔案數列

A.當檔案數太多, 砍不掉的時後該怎麼辦(錯誤訊息: rm: too many arguments 或 rm: Argument list too long)

先轉成 file owner 的身份去下指令(不然就轉成 root 吧!)

 ls -l | awk '{print $9}' | xargs rm  # 再來這樣子就可以砍掉

 ls -l *.jpg | awk '{print $9}' | xargs rm # 如果只要砍那目錄下的所有 jpg 檔簡單的 shell script 就搞定囉 :)

不過使用前請小心確認一下, 最後 xargs rm 先拿掉, 改成 less, 先確定一下是自己要砍的, 再下此指令吧 :)

B.-bash: /bin/mv: 引數列項目過長 or /bin/find 引數列項目過長
 
     解法: find $path -name '*.*' |xargs grep -i XXX

好像是使用xargs 就可以處理

Install Mysql Replcation


groupadd mysql
useradd -g mysql mysql
cd /usr/local
gunzip < /PATH/TO/MYSQL-VERSION-OS.tar.gz | tar xvf -
ln -s FULL-PATH-TO-MYSQL-VERSION-OS mysql
cd mysql
scripts/mysql_install_db --user=mysql
chown -R root  .
chown -R mysql data
chgrp -R mysql .
shell> bin/mysqld_safe --user=mysql &

./bin/mysqladmin -u root password 'XXXXXXX"
./bin/mysqladmin -u root -h vipms01.104.com.tw password 'XXXXXX'



MASTER:
./bin/mysqladmin create dbmail -u root -p
mysql -u root -p
GRANT ALL ON dbmail.* to dbmail@localhost identified by 'XXXXXXXX';
GRANT ALL ON dbmail.* to dbmail@10.0.2.73 identified by 'XXXXXXXX';
mysql -u dbmail dbmail -p < sql/mysql/create_tables_innoDB.mysql

mysql -u root -p

GRANG ALL PRIVILEGES ON *.* TO root@localhost IDENTIFIED BY 'XXXXXXXX'
GRANT FILE ON *.* TO dbmail@172.16.31.11 IDENTIFIED BY 'XXXXXXXX'
GRANT FILE,SELECT,REPLICATION SLAVE ON  *.* TO dbmail@172.16.31.11 IDENTIFIED BY 'XXXXXXXX';
FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;


UNLOCK TABLES;

mysqldump -u root --password=1qaz2wsx -a dbmail > /tmp/vipmsdb.sql
mysqladmin -u root --password=1qaz2wsx flush-hosts

mysql -u root dbmail -p < dump_file.sql


Master# vi /etc/my.cnf


在[mysqld]添加或修改以下的


[mysqld]
log-bin                              
server-id=1
sql-bin-update-same
binlog-do-db= reptest


Master# /var/eyou/mysql/bin/mysqladmin –u root –p shutdown
Master# /var/eyou/mysql/bin/safe_mysqld --user=mysql &


#chang slave my.cnf
2、Slave

修改my.cnf,增加如下几行:

server-id = 2

master-host = 172.16.31.111

master-user = dbmail

master-password = XXXXXXXX

master-port = 3306

set-variable=replicate-ignore-db=mysql

set-variable=replicate-do-db=dbmail

restart services

    $mysqld_safe &
mysql>change master to master_Host='172.16.31.111',master_user='dbmail',master_password='XXXXXXXX',master_log_file='mysql-bin.000074',master_log_pos=98;

    mysql>start slave;