shell 统计项目代码行数

Posted by wxianfeng Tue, 16 Nov 2010 17:52:00 GMT

你知道你目前的项目代码有多少行吗?有多少个文件吗?有多少个文件夹吗?。。。^o(∩∩)o…哈哈,这个很简单,一句shell就搞定了,效率还非常之高:

1,统计你项目的.rb 结尾的代码行数,去掉空格

find . -type f -name "*.rb" | xargs cat | grep -v ^$ | wc -l

当然你还可以添加去掉注释

2,统计项目文件所有行数,包括空行

find . -type f  | xargs cat | wc -l

3,统计项目有多少个文件

find . -type f  | wc -l

4,统计项目有多少个文件夹

find . -type d  | wc -l

5,找出项目下.rb 结尾的文件行数最大的一个(由小到大排序)

find . -type f -name "*.rb"  | xargs wc -l | sort -n

6,自由发挥

总之find 命令结合 xargs 很强大的说

这些都是基本的用法,例如上面想得到tar.gz 等压缩包的内容就难了,那么可以借助cloc(perl库)得到更详细的信息,各种文件类型的行数,注释,空行等等信息:

ubuntu 安装:

sudo apt-get install cloc

使用:

wxianfeng@ubuntu:/usr/local/system/projects/redmine_1_0_3$ cloc .
    6455 text files.
    3119 unique files.                                          
    1035 files ignored.

http://cloc.sourceforge.net v 1.09  T=13.0 s (204.8 files/s, 25293.4 lines/s)
-------------------------------------------------------------------------------
Language          files     blank   comment      code    scale   3rd gen. equiv
-------------------------------------------------------------------------------
Ruby               2076     33371     44800    178357 x   4.20 =      749099.40
YAML                197      1299       691     44512 x   0.90 =       40060.80
Javascript          105      1963      2111     12461 x   1.48 =       18442.28
Ruby HTML           241       716        29      4862 x   4.00 =       19448.00
CSS                  22       366       102      1889 x   1.00 =        1889.00
HTML                 15       120         3       627 x   1.90 =        1191.30
Perl                  2        80        98       233 x   4.00 =         932.00
SQL                   3        17         2        96 x   2.29 =         219.84
XML                   1         0         0         9 x   1.90 =          17.10
-------------------------------------------------------------------------------
SUM:               2662     37932     47836    243046 x   3.42 =      831299.72
-------------------------------------------------------------------------------

另外 rails 中已经封装了一个rake 任务,用来统计的,瞧瞧:

wxianfeng@ubuntu:/usr/local/system/projects/wxianfeng_com$ rake stats
(in /usr/local/system/projects/wxianfeng_com)
+----------------------+-------+-------+---------+---------+-----+-------+
| Name                 | Lines |   LOC | Classes | Methods | M/C | LOC/M |
+----------------------+-------+-------+---------+---------+-----+-------+
| Controllers          |  2422 |  1978 |      36 |     215 |   5 |     7 |
| Helpers              |   858 |   712 |       0 |     103 |   0 |     4 |
| Models               |  3360 |  2661 |      55 |     447 |   8 |     3 |
| Libraries            |  1203 |   884 |      30 |     143 |   4 |     4 |
| APIs                 |   436 |   353 |      17 |      23 |   1 |    13 |
| Functional tests     |    16 |    12 |       2 |       0 |   0 |     0 |
| Unit tests           |    16 |    12 |       3 |       0 |   0 |     0 |
| Model specs          |  2094 |  1680 |       1 |      24 |  24 |    68 |
| View specs           |   249 |   200 |       0 |      12 |   0 |    14 |
| Controller specs     |  3507 |  2734 |       2 |      37 |  18 |    71 |
| Helper specs         |    53 |    39 |       0 |       0 |   0 |     0 |
| Library specs        |    15 |    11 |       0 |       0 |   0 |     0 |
+----------------------+-------+-------+---------+---------+-----+-------+
| Total                | 14229 | 11276 |     146 |    1004 |   6 |     9 |
+----------------------+-------+-------+---------+---------+-----+-------+
  Code LOC: 6588     Test LOC: 4688     Code to Test Ratio: 1:0.7

see:

http://bbs.chinaunix.net/viewthread.php?tid=1665204
http://garfileo.is-programmer.com/2010/6/11/lines-counting-using-cloc.18828.html


Linux 登录日志

Posted by wxianfeng Tue, 31 Aug 2010 03:57:00 GMT

环境:centos 5.5

在这之前我的服务器密码很简单,感觉不安全,于是改的复杂一点了,顺手对我的登录日志分析了一下,还真发现了很多来破解root密码的远程ip,还记得之前在公司有一次上下班忘记打卡,行政找到我必须找出证据,于是从 我工作电脑中调出当天的登入登出信息 最好不过了 ,记得当时不太熟悉,还是在同事帮助下立即解决的, 另外合理的分析登录日志对你服务器的安全也有很大的作用~!

1,来看看你的服务器被哪些ip登录过(root密码错误的)

[root@li165-150 log]# grep "Failed password for root" /var/log/secure | awk '{print $9}' | uniq -c | sort -nr # awk分割,uniq -c 剔重 + 显示重复次数 ,  sort -nr 降序(-r) + 数值排序(-n)
   3116 69.162.125.77
    224 173.230.145.104
    111 184.106.229.209
     84 60.217.234.142
     76 222.237.78.139
     51 210.193.16.75
     46 88.191.73.232
     13 109.169.56.3
      4 220.165.28.67
      2 115.248.49.217
      1 88.191.52.74
      1 221.221.173.88
      1 220.181.147.187

从上面可以看出来有许多ip试图登录我的服务器,其中 69.162.125.77 就有 3116次失败记录 , 总共统计下:

[root@li165-150 log]#  grep "Failed password for root" /var/log/secure | awk '{print $9}' | wc -l
13730

哈,原来这么多人喜欢扫描我的服务器啊。。。。。

2,从 系统日志里查找 root 的相关信息

[root@li165-150 log]# cd /var/log
[root@li165-150 log]# find ./ -type f -name "messages*" | xargs grep "root" | more
./messages:2010-08-30T12:54:25.987395-04:00 li165-150 avahi-daemon[2862]: Successfully dropped root privileges.
./messages:2010-08-30T12:54:26.023483-04:00 li165-150 avahi-daemon[2862]: Successfully called chroot().
./messages.1:2010-08-20T22:55:03.457101-04:00 li165-150 avahi-daemon[2928]: Successfully dropped root privileges.
./messages.1:2010-08-20T22:55:03.504958-04:00 li165-150 avahi-daemon[2928]: Successfully called chroot().
./messages.1:2010-08-20T22:56:22.025464-04:00 li165-150 avahi-daemon[3047]: Successfully dropped root privileges.
./messages.1:2010-08-20T22:56:22.054287-04:00 li165-150 avahi-daemon[3047]: Successfully called chroot().
./messages.1:2010-08-21T14:21:13.824695-04:00 li165-150 avahi-daemon[2816]: Successfully dropped root privileges.
./messages.1:2010-08-21T14:21:13.907610-04:00 li165-150 avahi-daemon[2816]: Successfully called chroot().

3,当前登录用户的信息记录在文件/var/run/utmp 中,这是一个二进制文件 用普通的 tail , cat 等工具是无法查看的 , 但是可以通过一些命令来查看文件的信息,例如who

当前登录用户:

[root@li165-150 log]# who  # 或者 users 命令
root     ttyp1        Aug 31 12:13 (220.181.147.187)
root     ttyp2        Aug 31 12:53 (220.181.147.187)
[root@li165-150 log]# who -b # 上次启动时间
         system boot  Aug 30 12:54

更多的who命令请>who —help

4,所有登录进入和退出纪录在文件/var/log/wtmp中,也是二进制文件

[root@li165-150 log]# last -10 root # 查看root用户最后10次的登录情况
root     ttyp2        220.181.147.187  Tue Aug 31 12:53   still logged in   
root     ttyp1        220.181.147.187  Tue Aug 31 12:13   still logged in   
root     ttyp0        220.181.147.187  Tue Aug 31 09:06 - 13:16  (04:10)    
root     ttyp0        221.221.173.88   Mon Aug 30 22:40 - 22:42  (00:01)    
root     ttyp0        220.181.147.187  Mon Aug 30 12:55 - 13:11  (00:16)    
root     ttyp0        220.181.147.187  Mon Aug 30 12:51 - down   (00:01)    
root     ttyp1        221.221.8.126    Fri Aug 27 03:01 - 04:14  (01:12)    
root     ttyp0        125.34.211.119   Fri Aug 27 01:47 - 04:21  (02:33)    
root     ttyp0        125.34.211.119   Wed Aug 25 23:41 - 23:41  (00:00)    
root     ttyp0        221.221.8.126    Wed Aug 25 21:44 - 21:46  (00:01)    

wtmp begins Wed Jun  2 09:10:09 2010
[root@li165-150 log]# last # last命令往回搜索wtmp,来显示自从文件第一次创建以来登录过的用户
root     ttyp2        220.181.147.187  Tue Aug 31 12:53   still logged in   
root     ttyp1        220.181.147.187  Tue Aug 31 12:13   still logged in   
root     ttyp0        220.181.147.187  Tue Aug 31 09:06 - 13:16  (04:10)    
root     ttyp0        221.221.173.88   Mon Aug 30 22:40 - 22:42  (00:01)    
root     ttyp0        220.181.147.187  Mon Aug 30 12:55 - 13:11  (00:16)    
reboot   system boot  2.6.32.16-linode Mon Aug 30 12:54         (1+00:55)   
root     ttyp0        220.181.147.187  Mon Aug 30 12:51 - down   (00:01)    
root     ttyp1        221.221.8.126    Fri Aug 27 03:01 - 04:14  (01:12)    
root     ttyp0        125.34.211.119   Fri Aug 27 01:47 - 04:21  (02:33)    
root     ttyp0        125.34.211.119   Wed Aug 25 23:41 - 23:41  (00:00)    
root     ttyp0        221.221.8.126    Wed Aug 25 21:44 - 21:46  (00:01)    
root     ttyp0        125.34.211.119   Wed Aug 25 21:34 - 21:37  (00:02)

5,最后一次登录记录在 /var/log/lastlog 这个文件中,可以用lastlog查看

[root@li165-150 log]# lastlog             
Username         Port     From             Latest
root             ttyp2    220.181.147.187  Tue Aug 31 12:53:34 -0400 2010

6,清除登录log

>rm -f /var/log/wtmp
>cat /dev/null > /var/log/lastlog

另外今天学了一招历史命令的用法,之前都是用上箭头调出,若是调到前面第10个就需要10下,麻烦,可以用history命令搞定

[root@li165-150 log]# history 10 # 最近10条
 1085  last
 1086  last
 1087  last
 1088  lastlog
 1089  lastlog -u wxianfeng
 1090  lastlog
 1091  last
 1092  rm -f /var/log/wtmp
 1093  last
 1094  history 10
>history -c # 清除 history

SEE:
http://zhiwei.li/text/2010/06/linux%E7%99%BB%E5%BD%95%E6%97%A5%E5%BF%97/


centos install imagemagick + rmagick

Posted by wxianfeng Mon, 23 Aug 2010 06:17:00 GMT

环境:centos 5.5 + imagemagick 6.2.8 + rmagick 1.15.17

原本想安装最新版的rmagick的,但是发现编译ImageMagick安装不是少这个就是少那个,一汽之下,最后还是 yum 安装的比较快。。。。

如果你已经yum安装了,但是想再编译安装,需要先卸载原来的:

>yum remove ImageMagick

安装过程:

yum install ImageMagick
yum install ImageMagick-devel
gem install rmagick -v=1.15.17 --no-rdoc --no-ri -- --disable-htmldoc # 注意后面的参数需要加上,没加上会报错

安装 rmagick时主要还有版本问题,出错的话,会提示你ImageMagick必须大于多少版本,那么如何查看ImageMagick版本?

>convert -version

SEE:
http://stackoverflow.com/questions/1254366/problem-installing-rmagick-rubygem-on-centos-5


postfix 关闭open-relay

Posted by wxianfeng Sat, 21 Aug 2010 20:54:00 GMT

环境:centos 5.5 + postfix 2.3.3

[root@li165-150 ~]# postconf mail_version
mail_version = 2.3.3

上次,http://wxianfeng.com/2010/08/20/linode-mysql-got-error-28-from-storage-engine,刚刚解决了blog不能访问的问题 , 由于磁盘占满的原因 ,一天时间没到我的磁盘又被占满了,还是maillog在一直增长的原因,经过查找原因,原来我的mail server变成了肉鸡,被人拿来发送大量的垃圾邮件了,刚开始配的时候不太懂,没注意 open relay的情况 , http://wxianfeng.com/2010/08/01/centos-install-mail-server,所以,必须关系open replay功能~!

1,什么是open – relay ?
顾名思义,relay的转发的意思 , Open-Relay(开放转发或匿名转发)是指由于邮件服务器不理会邮件发送者或邮件接受者的是否为系统所设定的用户,而对所有的入站邮件一律进行转发(RELAY)的功能。通常,若邮件服务器的此功能开放,则我们一般称此邮件服务器是Open-Relay的

2,怎么测我的mail server 是不是 open relay 的 ?

[root@li165-150 ~]# telnet mail.wxianfeng.com 25
Trying 173.230.155.150...
Connected to mail.wxianfeng.com.
Escape character is '^]'.
220 mail.wxianfeng.com ESMTP Postfix
mail from:ss@163.com
250 2.1.0 Ok
rcpt to:wang.fl_1429@gmail.com
554 5.7.1 <wang.fl_1429@gmail.com>: Relay access denied

上面出现了 Relay access denied , 则说明你的mail server 不是 open replay的 ,如果可以成功发送email , 则说明 你的mail server 是 open replay的 ,另外 , 还可以通过以下网址测试:
http://verify.abuse.net/relay.html
直接输入 mail.wxianfeng.com 测试

3,open-relay 后 , 被人盗寄的症状

>mailq 查看邮件队列,会发现里面有大量的邮件等待发送

>tail -f /var/log/maillog

出现了大量的像下面这样的log:

2010-08-21T05:52:31.424284-04:00 li165-150 postfix/qmgr[8366]: 0C50427536: to=<xlgaga@yahoo.com.tw>, relay=none, delay=141354, delays=141354/0.04/0/0, dsn=4.7.1, status=deferred 

(delivery temporarily suspended: host mx2.mail.tw.yahoo.com[203.188.197.10] refused to talk to me: 421 4.7.1 [TS03] All messages from 173.230.155.150 will be permanently 

deferred; Retrying will NOT succeed. See http://postmaster.yahoo.com/errors/421-ts03.html)
2010-08-21T05:52:31.425279-04:00 li165-150 postfix/qmgr[8366]: 0C50427536: to=<xocy@yahoo.com.tw>, relay=none, delay=141354, delays=141354/0.04/0/0, dsn=4.7.1, status=deferred 

(delivery temporarily suspended: host mx2.mail.tw.yahoo.com[203.188.197.10] refused to talk to me: 421 4.7.1 [TS03] All messages from 173.230.155.150 will be permanently 

deferred; Retrying will NOT succeed. See http://postmaster.yahoo.com/errors/421-ts03.html)
2010-08-21T05:52:31.426311-04:00 li165-150 postfix/qmgr[8366]: 0C50427536: to=<xup6ru4vm0@yahoo.com.tw>, relay=none, delay=141354, delays=141354/0.04/0/0, dsn=4.7.1, 

status=deferred (delivery temporarily suspended: host mx2.mail.tw.yahoo.com[203.188.197.10] refused to talk to me: 421 4.7.1 [TS03] All messages from 173.230.155.150 will be 

permanently deferred; Retrying will NOT succeed. See http://postmaster.yahoo.com/errors/421-ts03.html)
2010-08-21T05:52:31.427198-04:00 li165-150 postfix/qmgr[8366]: 0C50427536: to=<y2003625@yahoo.com.tw>, relay=none, delay=141354, delays=141354/0.05/0/0, dsn=4.7.1, 

status=deferred (delivery temporarily suspended: host mx2.mail.tw.yahoo.com[203.188.197.10] refused to talk to me: 421 4.7.1 [TS03] All messages from 173.230.155.150 will be 

permanently deferred; Retrying will NOT succeed. See http://postmaster.yahoo.com/errors/421-ts03.html)
2010-08-21T05:52:31.428079-04:00 li165-150 postfix/qmgr[8366]: 0C50427536: to=<yck1012.tw@yahoo.com.tw>, relay=none, delay=141354, delays=141354/0.05/0/0, dsn=4.7.1, 

status=deferred (delivery temporarily suspended: host mx2.mail.tw.yahoo.com[203.188.197.10] refused to talk to me: 421 4.7.1 [TS03] All messages from 173.230.155.150 will be 

permanently deferred; Retrying will NOT succeed. See http://postmaster.yahoo.com/errors/421-ts03.html)
2010-08-21T05:52:31.429149-04:00 li165-150 postfix/qmgr[8366]: 0C50427536: to=<yfjtommu@yahoo.com.tw>, relay=none, delay=141354, delays=141354/0.05/0/0, dsn=4.7.1, 

status=deferred (delivery temporarily suspended: host mx2.mail.tw.yahoo.com[203.188.197.10] refused to talk to me: 421 4.7.1 [TS03] All messages from 173.230.155.150 will be 

permanently deferred; Retrying will NOT succeed. See http://postmaster.yahoo.com/errors/421-ts03.html)
2010-08-21T05:52:31.430203-04:00 li165-150 postfix/qmgr[8366]: 0C50427536: to=<yfk134@yahoo.com.tw>, relay=none, delay=141354, delays=141354/0.05/0/0, dsn=4.7.1, status=deferred 

(delivery temporarily suspended: host mx2.mail.tw.yahoo.com[203.188.197.10] refused to talk to me: 421 4.7.1 [TS03] All messages from 173.230.155.150 will be permanently 

deferred; Retrying will NOT succeed. See http://postmaster.yahoo.com/errors/421-ts03.html)
2010-08-21T05:52:31.431290-04:00 li165-150 postfix/qmgr[8366]: 0C50427536: to=<yi05@yahoo.com.tw>, relay=none, delay=141354, delays=141354/0.05/0/0, dsn=4.7.1, status=deferred 

(delivery temporarily suspended: host mx2.mail.tw.yahoo.com[203.188.197.10] refused to talk to me: 421 4.7.1 [TS03] All messages from 173.230.155.150 will be permanently 

deferred; Retrying will NOT succeed. See http://postmaster.yahoo.com/errors/421-ts03.html)

从log中可以看出 , 你的mail server 正在发往yahoo的email,但是全部被拒绝了 ,

4,为什么 会被人盗寄?

网络上 会有很多人用 port scan工具扫描端口 , 当你的25端口, 被人测出是open relay的,这些人就会 充分利用你的mail server 来发垃圾邮件 ,发垃圾邮件的后果 ,可能会导致你的 ip被封 , 被世界垃圾邮件组织 把你ip 拉入黑名单 , 这时你的mail server 也就是废物了。

5,如果关闭 盗寄 的邮件?
我的mail server 有大量的 发送队列, 怎么清除 ,用下面命令

[root@li165-150 mail]# postsuper -d ALL
postsuper: Deleted: 61178 messages

发现我清楚了 61178 封垃圾邮件队列 , 这样你的log 应该会停止了, 不会再狂刷了。。。

6,如何关闭open-relay ?
配置 postfix的 mynetworks

mynetworks = 127.0.0.1/32 # ip/netmask

我的整个 postfix main.cf 配置 :

[root@li165-150 ~]# postconf -n
alias_database = hash:/etc/aliases
alias_maps = hash:/etc/aliases
broken_sasl_auth_clients = yes
command_directory = /usr/sbin
config_directory = /etc/postfix
daemon_directory = /usr/libexec/postfix
debug_peer_level = 2
home_mailbox = Maildir/
html_directory = no
inet_interfaces = $myhostname, localhost , 173.230.155.150 # 设置postfix服务监听的网络接口 通常是将所有的网络接口都开放,以便接收任何网络接口的邮件
mail_owner = postfix
mailq_path = /usr/bin/mailq.postfix
manpage_directory = /usr/share/man
mydestination = $myhostname,$mydomain,localhost.$mydomain , localhost ,  $mydomain,mail.$mydomain,www.$mydomain # 设置可接收邮件的主机名称或域名
mydomain = wxianfeng.com # 邮件域名
myhostname = mail.wxianfeng.com # 邮件主机名
mynetworks = 127.0.0.1/32 # 设置可转发(Relay)哪些网络的邮件
myorigin = $mydomain  # 由本机寄出的域名
newaliases_path = /usr/bin/newaliases.postfix
queue_directory = /var/spool/postfix
readme_directory = /usr/share/doc/postfix-2.3.3/README_FILES
relay_domains = $mydestination # 设置可转发哪些网域的邮件
sample_directory = /usr/share/doc/postfix-2.3.3/samples
sendmail_path = /usr/sbin/sendmail.postfix
setgid_group = postdrop
smtpd_recipient_restrictions = permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination
smtpd_sasl_auth_enable = yes # SASL来完成SMTP的SMTP-AUTH功能,postfix 本身没有认证机制
smtpd_sasl_local_domain = wxianfeng.com
smtpd_sasl_path = private/auth
smtpd_sasl_security_options = noanonymous
smtpd_sasl_type = dovecot
unknown_local_recipient_reject_code = 550
virtual_mailbox_domains = $mydomain

See:
http://www.raidenhttpd.com/jlbb/viewtopic.php?p=82160&sid=661a10a71ded2a6280fdd5ad6ba20101
http://www.linuxgoo.com/2005/66127/10433644999.html
http://blog.csdn.net/daisy_cheung/archive/2009/01/16/3795087.aspx
http://www.cnblogs.com/newversion/articles/1490910.html


shell 监控网站

Posted by wxianfeng Fri, 06 Aug 2010 03:34:00 GMT

写了个shell脚本 监控网站 是否能ping通(前提是你iptables设置允许ping),还有测试 访问网站首页 返回的状态 是否 是 200 ,如果出现异常会发邮件 和 短信,ping域名不通了 , 说明你的网关到ISP那的网络不通 ,ping IP 地址不通 , 说明你的网关到你的服务器的网络有问题 , ping 域名不通 , ping IP地址通, 那就应该是DNS解析的问题了。

shell脚本:

#!/bin/sh

if [ $# -ne 1 ]  # -ne 不等于
then
        echo "Usage: $0 <URL>"; # $0 得到当前文件名
        exit;
fi

if ping -c 2 $1  # $1 得到第一个参数
then
        echo "server is running" 
else
        echo "$1 is down" | mail -s "$1 is down" wang.fl1429@gmail.com
        curl "http://sms.api.bz/fetion.php?username=15001100000&password=12345&sendto=15001100000&message=$1%20is%20down"
fi

response=$(curl -s -I -L $1 | grep HTTP);

status=${response#* }; # Strip off characters up to the first space
status=${status:0:3}; # Just use the 3 digit status code

if [ "$status" != "200" ]
then
        echo "Error fetching $1. Status code $status" | mail -s "$1 response code is not 200" wang.fl1429@gmail.com;
        curl "http://sms.api.bz/fetion.php?username=15001100000&password=12345&sendto=15001100000&message=$1%20response%20status%20code%20$status"
fi

或者

#!/bin/sh

if [ $# -ne 1 ]  # -ne 不等于
then
        echo "Usage: $0 <URL>"; # $0 得到当前文件名
        exit;
fi

ping -c 2  $1 &>/dev/null # $1 得到第一个参数 , -c 2 是发送两次数据包  , &>/dev/null  输出内容null

if [ $? = 0  ]   # $?输出命令退出代码:0为命令正常执行,1-255为有出错
then
        echo "server is running" 
else
        echo "$1 is down" | mail -s "$1 is down" wang.fl1429@gmail.com
        curl "http://sms.api.bz/fetion.php?username=15001100000&password=12345&sendto=15001100000&message=$1%20is%20down"
fi

response=$(curl -s -I -L $1 | grep HTTP);

status=${response#* };               # Strip off characters up to the first space
status=${status:0:3};           # Just use the 3 digit status code

if [ "$status" != "200" ]
then
        echo "Error fetching $1. Status code $status" | mail -s "$1 response code is not 200" wang.fl1429@gmail.com;
        curl "http://sms.api.bz/fetion.php?username=15001100000&password=12345&sendto=15001100000&message=$1%20response%20status%20code%20$status"
fi

让shell脚本添加 可执行

chmod +x monitor_domain.sh

添加 crontab 任务

>crontab -e
 # m     h    d   mon  dow    command
  */10    *    *   *    *    /usr/local/system/shell/monitor_domain.sh "wxianfeng.com" # 每10分钟运行一次

发短信 api 用的是别人的 , 以后自己可以搭一个 API , 发短信除了这个办法 , 还有一个办法 , 申请一个 139的email , 139 的email可以设置邮件 短信提醒 , 同时收到邮件 和 短信,不错 ,
我的centos 5.5 在执行 mail 命令时提示找不到 , 需要安装mailx 库解决:

yum install mailx

see:
http://www.coderholic.com/server-status-checker-shell-script-2/
http://blog.s135.com/fetion_api/


centos install mail server

Posted by wxianfeng Sat, 31 Jul 2010 16:04:00 GMT

环境:centos 5.5 + postfix + dovecot +SASL + Squirrelmail

postfix 提供smtp服务,dovecot 提供pop3,imap服务,sasl提供smtp认证服务, Squirrelmail 是webmail 用来收发邮件之用,最近需要发送email的服务,本想使用gmail的smtp的,后来索性就自己搭了个,以便熟悉mail服务器的搭建过程,一路下来,发现还真不是一件容易的事 ,这个还是比较简单的,还有加密传输,反垃圾邮件处理等等东西没弄,搭建过程中遇到的问题比较多, 问题最大的地方是 例如我用 gmail 发送邮件给 wxianfeng@wxianfeng.com, 邮件收不到,gmail中也没有显示退信信息,说明邮件还是发出去了,最后发现是 postfix 的配置文件 mynetworks 配置错误 ……

上面的是我mail服务器搭建的选择,当然你也可以选择别的mail服务器 , 例如 smtp你可以选择sendmail , 或者你可以看看别人的mail服务器是什么,eg:

[root@li165-150 ~]# telnet vic360.com 25     # 或者  telnet vic360.com smtp
Trying 221.6.104.142...
Connected to vic360.com.
Escape character is '^]'.
220 mail.vic360.com Kerio MailServer 6.3.1 ESMTP ready
quit
221 2.0.0 SMTP closing connection
Connection closed by foreign host.
[root@li165-150 ~]# telnet vic360.com pop3 # 或者  telnet vic360.com 110
Trying 221.6.104.142...
Connected to vic360.com.
Escape character is '^]'.
+OK Kerio MailServer 6.3.1 POP3 server ready <12927.1280636072@mail.vic360.com>

可以看出 vic360 的mail服务器选择的是 Kerio MailServer , 25 一般是 smtp的port , 110 是 pop3 的port

[root@li165-150 ~]# telnet mail.beebuyer.com smtp
Trying 218.202.225.66...
Connected to mail.beebuyer.com.
Escape character is '^]'.
220 mobase.cn ESMTP MDaemon 9.5.1; Sun, 01 Aug 2010 12:21:07 +0800
quit
221 See ya in cyberspace
Connection closed by foreign host.
[root@li165-150 ~]# telnet mail.beebuyer.com pop3
Trying 218.202.225.66...
Connected to mail.beebuyer.com.
Escape character is '^]'.
+OK mobase.cn POP MDaemon 9.5.1 ready <MDAEMON-F201008011221.AA2142193MD8611@mobase.cn>

可以看出 beebuyer.com 的 mail server 是 MDaemon 9.5.1

okay , 下面介绍 我的 mail server的搭建过程:

1,安装 postfix ,卸载sendmail

yum update
yum remove sendmail
yum install postfix

2,配置 postfix

>vim /etc/postfix/main.cf 
myhostname = mail.wxianfeng.com
mydomain = wxianfeng.com
myorigin = $mydomain
inet_interfaces = $myhostname, localhost , 173.230.155.150 # 173.230.155.150 是我服务器IP
mydestination = $myhostname,localhost.$mydomain , localhost ,  $mydomain,mail.$mydomain,www.$mydomain
mynetworks = 0.0.0.0/0
home_mailbox = Maildir/ # email的存放地址 , 默认是存放在file中,你还可以配置mysql , 存到mysql 中

3,安装配置SASL + TLS

>yum install cyrus-sasl
>vim /etc/postfix/main.cf 
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = wxianfeng.com
smtpd_recipient_restrictions = permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination
smtpd_sasl_security_options = noanonymous
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
broken_sasl_auth_clients = yes

4,安装配置 Dovecot

>yum install dovecot
>vim /etc/dovecot.conf
protocols = pop3 pop3s imap imaps
mail_location = maildir:~/Maildir/    # email的存放地址
pop3_uidl_format = %08Xu%08Xv
auth default {
mechanisms = plain login
passdb pam {
}
userdb passwd {
}
socket listen {
client {
path = /var/spool/postfix/private/auth
mode = 0660
user = postfix
group = postfix
}
}
}

5,安装配置 Squirrelmail

>yum install squirrelmail
>vim  /etc/httpd/conf.d/squirrelmail.conf
Alias /webmail /usr/share/squirrelmail # 配置apache
>/usr/share/squirrelmail/config/conf.pl
2 -> 1  Domain : wxianfeng.com # 配置域名
10 -> 2   Default Charset : utf-8  # 配置编码

6,重启所有服务

/etc/init.d/postfix restart
/etc/init.d/dovecot restart
/etc/init.d/saslauthd restart
service httpd restart

7,测试安装是否成功

http://wxianfeng.com:8080/webmail/src/configtest.php

http://wxianfeng.com:8080/webmail 访问, 可以 收发email

8,创建mail用户

>adduser wxianfeng
>passwd  12345

9,本地测试收发email

smtp发:

>telnet localhost smtp
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
220 mail.wxianfeng.com ESMTP Postfix
>ehlo localhost
250-mail.wxianfeng.com
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
>mail from:wxianfeng
250 2.1.0 Ok
>rcpt to:wxianfeng
250 2.1.5 Ok
>data
354 End data with <CR><LF>.<CR><LF>
test
.    # 以 . 结束输入
250 2.0.0 Ok: queued as 9729067C17
quit
221 2.0.0 Bye
Connection closed by foreign host.

查看 发送队列

[root@mail ~]# cd /home/wxianfeng/Maildir/new
[root@mail new]# ls
1185669817.Vfd00I18012M795756.mail.wxianfeng.com
[root@mail new]# cat 1185669817.Vfd00I18012M795756.mail.wxianfeng.com

pop3 收 测试:

[root@li165-150 ~]# telnet localhost pop3
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
+OK Dovecot ready.
user wxianfeng
+OK
pass 12345
+OK Logged in.
list
+OK 11 messages:
1 483
2 453
3 809
4 853
5 2029
6 2671
7 2721
8 2870
9 3178
10 2749
11 2702
.
retr 1
+OK 483 octets
Return-Path: <wxianfeng@wxianfeng.com>
X-Original-To: wxianfeng@wxianfeng.com
Delivered-To: wxianfeng@wxianfeng.com
Received: from localhost (localhost [127.0.0.1])
        by li165-150.wxianfeng.com (Postfix) with ESMTP id D31F91331F
        for <wxianfeng@wxianfeng.com>; Thu, 29 Jul 2010 03:35:50 -0400 (EDT)
Message-Id: <20100729073619.D31F91331F@li165-150.wxianfeng.com>
Date: Thu, 29 Jul 2010 03:35:50 -0400 (EDT)
From: wxianfeng@wxianfeng.com
To: undisclosed-recipients:;

test
.

10 , 域名 设置

必须保证你的 域名设置那有 mail.wxianfeng.com 指向你的 ip , 或者你有 *.wxianfeng.com 的 泛域名 解析

11,添加 MX record
在你的域名商那添加 MX record ,例如我的在godaddy,什么是mx record: 邮件交换记录(MX record)是一个DNS资源记录类型,它指出哪个主机能够处理一个特定域的e-mail。把godaddy默认的mx record删除掉,我的默认是下面的这两个,删除之:

Priority    Host               Goes To                                                   TTL
10              @               mailstore1.secureserver.net             1 Hour
0                @               smtp.secureserver.net                         1 Hour

添加自己的:

   Priority          Host          Goes To                           TTL          
10 @ mail.wxianfeng.com 1 Hour

设置好后 可能过段时间才生效,测试生效方法,.下面结果说明已经生效:

[root@li165-150 ~]# host -t mx wxianfeng.com 
wxianfeng.com mail is handled by 10 mail.wxianfeng.com.

12,解决Squirrelmail 内中文email的乱码
在option(选项)那设置显示语言为 中文简体即可

13,如果你的Squirrelmail 不可以 收发邮件,可以直接远程telnet 测试

>telnet mail.wxianfeng.com 25
mail from:wxianfeng
rcpt to:wang.fl1429@gmail.com
.........


>telnet mail.wxianfeng.com 110
user wxianfeng
pass 12345
list
retr 1
......

如果telnet 可以发送成功 , 就没 问题….

14,查看错误
如果过程中出现错误,可以随时查看log

>tail -f  /var/log/maillog

that’s all , just do it

See :
http://www.mysql-apache-php.com/mailserver.htm
http://www.linuxmail.info/postfix-smtp-server-howto-centos-5/

douban blog 认领标识:

doubanclaim5c7c4eaf84713af2


windows ssh client

Posted by wxianfeng Fri, 30 Jul 2010 16:25:00 GMT

如果你是命令行爱好者,我想ssh应该是你用的最多的工具了,那么在windows有好的ssh client吗,个人用过下面三个client,总结下来,力荐 secureCRT ,

1, putty

download:
http://www.newhua.com/soft/2186.htm

比较简单 , 小巧, 免费 , 支持语法高亮, 单tab , 值得推荐, 适合服务器 机器不多的情况下使用 , 如果你需要同时连接 多个 电脑的话 , 那么用起来就麻烦了

2,ssh secure shell client

download:
http://www.onlinedown.net/soft/20089.htm

免费, 也是单标签 , 默认没有语法高亮 , 同时 带了 ssh 文件上传功能 , 如果你需要上传文件 , 又需要 命令行管理服务器 , 那么 ssh secure shell client 还是不错的

3,SecureCRT

download:
http://www.onlinedown.net/softdown/46646_2.htm

最后推荐secureCRT ,默认不支持 语法高亮, 杀手锏的是支持多标签和rz上传,sz下载功能,可以保存会话状态(密码), 还有就是不免费, 但是晚上破解版的 到处都是 , 下载后 更改 一些配置 ,例如,语法高亮等,配色, 用起来还是很
爽的。。。

centos 中的支持VIM高亮配置 和 中文乱码解决:

(1),在SecureCRT中设置 选项→会话选项→终端→仿真→终端:Linux,选中ANSI Color,全局设置的话,选择 选项→ 全局选项 设置即可

(2), 选项 → 会话选项 → 外观 修改字符编码为 UTF-8 (很重要,必须设置)

(3),

>vim /etc/vimrc
syntax on # 添加语法高亮 开启
set encoding=utf-8 # 修改编码为 utf-8

服务器端是ubuntu的话 , CRT 使用 rz,sz 命令的话,必须安装 lrzsz

sudo apt-get install lrzsz

centos :

yum install lrzsz

mac:

>wget ftp://ftp.kfki.hu/pub/Sun/freeware/SOURCES/lrzsz-0.12.20.tar.gz
>tar -zvxf lrzsz-0.12.20.tar.gz
>cd lrzsz
>./configure --prefix=/usr/local/lrzsz
>make
>make install
>ln -s /usr/local/lrzsz/bin/lrz /usr/bin/lrz
>ln -s /usr/local/lrzsz/bin/lsz /usr/bin/lsz

rz 上传到当前目录,sz下载到 user目录下 ,例如: C:\Users\Administrator\Downloads

SEE:
http://blog.s135.com/post/207/
http://tuhaitao.javaeye.com/blog/504919


centos 5.5 install svn server

Posted by wxianfeng Wed, 14 Jul 2010 05:10:00 GMT
为了个人的项目代码的同步,例如我在公司写的代码,回家后还能继续同步写下去,在我的VPS上搭了个svn server,搭建步骤:

1,安装subversion

yum update 
yum install subversion

3,创建和配置代码仓库

cd /usr/local/system
svnadmin create vcs

# 配置工程
vim vcs/conf/svnserve.conf
# 取消掉如下两行的注释
# auth-access = write
# password-db = passwd
 
# 配置该工作的用户与密码
vim vcs/conf/passwd
[users]
wxianfeng = 12345

4,启动svn server

cd /usr/local/system
svnserve -d -r vcs

5,导入工程

svn import wxianfeng_com svn://173.230.155.150/wxianfeng_com  -m "first import" --username wxianfeng --password 12345 # 远程 或本机导入
svn import wxianfeng_com file:///localhost/wxianfeng_com # 本机导入

前面的wxianfeng_com 是本地的文件夹,后面的wxianfeng_com 是svn仓库的project name , 或者你可以借助netbeans,eclipse带的svn客户端直接导入netbeans中或eclipse中的project到svn仓库中

6,checkout项目

svn co svn://173.230.155.150/wxianfeng_com

以上就可以做到一个仓库,多个项目的目的了,当有另外一个project时,直接import即可,如果想删除仓库中的某个工程,可以执行delete命令

svn delete svn://173.230.155.150/wxianfeng_com -m "delete project"

See:
http://www.tonyspencer.com/2007/03/02/setup-a-subversion-server-in-4-minutes/
http://blog.itmem.com/archives/1207


centos 5.5 安装 php + phpmyadmin

Posted by wxianfeng Thu, 08 Jul 2010 05:48:00 GMT

这几天真是和phpmyadmin有缘啊,老是和他接触,今天又在我的linode VPS上搭建了个phpmyadmin,用来管理mysql数据库,装好后才猛然发现我的数据库中中文全部是乱码,但是rails读出来后是中文,也就是大家看到我现在的这个blog是中文,但是mysql里是乱码,看了下所有的编码都是utf-8形式,诡异的问题,这个问题比较棘手,必须解决。但是今天写的是 centos 5.5 上如何搭建phpmyadmin ,和其他系统的安装的大同小异

1,安装php

yum install php – enablerepo=centosplus

注意 – 和 enablerepo 之间有个空格 , 加上 – enablerepo=centosplus 为了安装到5.x的php,如果直接 yum install php 的话 , 则安装的是php 4.x 系列

以后更新php 可以执行下面的命令:

yum update php –enablerepo=centosplus

结束后 可以用 php -v 查看安装的版本信息

2,安装phpmyadmin

到phpmyadmin官网下载 phpmyadmin , 注意下载的版本 必须注意支持的mysql 和 php 版本

我用的是 2.1 版,安装和配置过程:

>cd /usr/local/system # 进入到该目录下,这个一般是我的工作目录,你可以任意指定 
>wget http://downloads.sourceforge.net/project/phpmyadmin/phpMyAdmin/2.11.10/phpMyAdmin-2.11.10-all-languages.tar.gz?use_mirror=cdnetworks-kr-1&27689465 # 下载 phpmyadmin
>tar -zvxf phpMyAdmin-2.11.9.5-all-languages.tar.gz # 解压
>mv phpMyAdmin-2.11.9.5-all-languages phpmyadmin # rename
>cp config.sample.inc.php config.inc.php
>vi config.inc.php
$cfg['blowfish_secret'] = ‘TypeAnything_for_Secure’; # 找到 $cfg['blowfish_secret']  值为后面的值
>vi /etc/httpd/conf.d/phpmyadmin.conf
Alias /phpmyadmin /usr/local/system/phpmyadmin # 添加该代码

3,配置apache的端口

>vi /etc/httpd/conf/httpd.conf
Listen:8080 # 修改Listen 端口为 8080

4,重启 apache

service httpd restart
>netstat -antup # 可以查看端口启动情况

5,访问phpmyadmin

http://localhost:8080/phpmyadmin

报错,php 不能加载 mysql 模块 ,因为 php 没有安装 mysql 扩展,安装之:

>yum install php-mysql - enablerepo=centosplus

再次访问 phpmyadmin .OK 成功了

tips:
登录phpmyadmin出现下面错误 #2002 Cannot log in to the MySQL server
修改config.inc.php 的localhost 为 127.0.0.1 即可

>vim config.inc.php

我的phpmyadmin地址:
http://wxianfeng.com:8080/phpmyadmin

See:
https://www.sevenl.net/blog/how-to-install-lamp-phpmyadmin-and-vsftp-on-centos-5-3-using-yum/
http://imthi.com/blog/linux/install-or-update-php-5-on-centos.php


capistrano + nginx + thin + subversion 自动部署

Posted by wxianfeng Fri, 02 Jul 2010 19:45:00 GMT

以前部署app还是用很老套的ssh客户端,windows我使用 SSH Secure Shell Client , linux 上使用 Filezilla , 传代码非常之慢,今天体验下rails capistrano 自动部署 , 确实挺方便的 , 实现了ssh远程登录操作的一系列操作 , capistrano 的实现原理是 , 本地客户端 执行命令,实质进行了一系列远程操作,部署同步的根本是check 版本控制系统的最新版,版本控制系统可以是subversion,git等 , 我用的是 subversion,步骤:

我的环境;nginx + thin + capistrano 2.5.19 (客户端) + centos 5.5 + subversion

1,安装 capistrano

gem install capistrano

2,rails app加入 capistrano 配置文件

capify .

3,配置 config 下的deploy.rb ,最核心的东西都在这个文件里

set :application, "wxianfeng_com" #  工程名, 随便写了 

set :repository,  "svn://173.230.155.150/wxianfeng_com"   # svn 地址
set :scm, :subversion # 使用 suversion版本控制
# Or: `accurev`, `bzr`, `cvs`, `darcs`, `git`, `mercurial`, `perforce`, `subversion` or `none`
set :scm_username, 'wxianfeng'   # svn 用户名
set :scm_password, '123456'  #svn 密码
set :checkout, "export" # 使用export方式, svn版本信息不需要 track下来

role :web, "173.230.155.150"                          #  这三个填你服务器的ip地址
role :app, "173.230.155.150"                          # 
role :db,  "173.230.155.150", :primary => true # 
# role :db,  "your slave db-server here"

set :deploy_to, "/usr/local/system/www/wxianfeng_com"  # 部署到remote 服务器路径
set :deploy_via, :remote_cache # 通过 remote_cache 方式部署 ,还有一种本地copy的方式
set :user, "root"  # remote 服务器的用户名 
set :runner, "root" # 同上
set :password, "123456" # 服务器的 root 密码

set :rake, "/usr/bin/rake" # 服务器上rake 命令path
default_run_options[:shell] = false 
default_run_options[:pty] = true
set :use_sudo, true # 允许使用 sudo

namespace :deploy do
  
  task :start , :roles => :app do
    invoke_command "cd  .." # invoke_command 是连到 服务器上执行的命令
    invoke_command "thin start -C /etc/thin/thin.yml"
  end
  
  task :stop ,:roles => :app  do
    invoke_command "killall thin" # or "thin stop -C /etc/thin/thin.yml"
  end

  task :restart, :roles => :app, :except => { :no_release => true } do
    #run "#{try_sudo} touch #{File.join(current_path,'tmp','restart.txt')}"
    invoke_command "cd .."
    invoke_command "thin restart -C /etc/thin/thin.yml -O" #  -O 是onebyone(关一个,启一个) 启动thin ,注意是 大写
  end

  desc "Symlink shared configs and folders on each release."
  task :symlink_shared do
    run "rm -rf #{release_path}/public/files" # 创建 软连接, 保证服务器上 图片的 同步
    run "ln -nfs #{shared_path}/public/files #{release_path}/public/files" # or  current_path    run 等同于 invoke_command
  end


end

after 'deploy:update_code', 'deploy:symlink_shared' # 在 deploy:update_code 执行后 callback deploy:symlink_shared

以上当你执行 cap deploy 后 大体执行过程是 先 update_code 然后 deploy:symlink_shared 最后 deploy:restart 服务器 , 上面有一个thin的配置 /etc/thin/thin.yml,如果没有的话, 可以到服务器上生成:

thin config -C /etc/thin/thin.yml -c /usr/local/system/www/wxianfeng_com/current  -s 3 -e production -p 3000

4,部署
第一次部署需要运行下面的命令:

cap deploy:setup

报错:

sh: sudo: command not found 

解决:

>vi  /etc/sudoers
# Disable "ssh hostname sudo <cmd>", because it will show the password in clear.
#         You have to run "ssh -t hostname sudo <cmd>".
#
#Defaults    requiretty #将这行注释掉

这个命令会在服务器上配置好相关的目录结构.然后再运行:


cap deploy:check



检查通过

第一次部署用的命令是:


cap deploy:cold

以后部署都可以直接用:

cap deploy

修改 nginx 配置:

 root   /usr/local/system/www/wxianfeng_com/current/public/;



修改 root 根目录为 cpistrano 的 current_path 的 public 目录
ok , 你以后更新代码 只需要 cap deploy 就ok了 , 前提是你先 commit 代码到 svn 服务器上 , 用capistrano好处还有一个可以 备份代码 , 因为每一次部署 其实就是相当于 track了svn版本里的最新代码

See:
http://gautamrege.wordpress.com/2009/11/10/capistrano-nginx-thin-deployment-on-linode/
http://weekface.info/2010/03/15/rails-git-capistrano
http://rustammamedov.wordpress.com/2009/12/27/capistrano-nginx-mongrel-deployment/