inotify-tools使用方法介绍

inotify-tools 是为linux下inotify文件监控工具提供的一套c的开发接口库函数,同时还提供了一系列的命令行工具,这些工具可以用来监控文件系统的事件。 inotify-tools是用c编写的,除了要求内核支持inotify外,不依赖于其他。inotify-tools提供两种工具,一是inotifywait,它是用来监控文件或目录的变化,二是inotifywatch,它是用来统计文件系统访问的次数。现在介绍一下它的使用方法。

安装方法

  1. wget http://github.com/downloads/rvoicilas/inotify-tools/inotify-tools-3.14.tar.gz
  2. tar xzf inotify-tools-3.14.tar.gz ;cd inotify-tools-3.14
  3. ./configure –prefix=/usr && make && su -c ‘make install’

使用例子

inotifywait

1、实时监控/home的所有事件(包括文件的访问,写入,修改,删除等)

  1. inotifywait -rm /home

2、监控/var/log/messeges中有关httpd的日志

  1. #!/bin/sh
  2.        while inotifywait -e modify /var/log/messages; do
  3.          if tail -n1 /var/log/messages | grep httpd; then
  4.            kdialog –msgbox "Apache needs love!"
  5.          fi
  6.        done

inotifywatch

1、统计/home文件系统的事件

  1. inotifywatch -v -e access -e modify -t 60 -r /home

参数说明

inotifywait

语法:
inotifywait [-hcmrq] [-e ] [-t ] [–format ] [–timefmt ] [ … ]
参数:
-h,–help
输出帮助信息
@
排除不需要监视的文件,可以是相对路径,也可以是绝对路径。
–fromfile
从文件读取需要监视的文件或排除的文件,一个文件一行,排除的文件以@开头。
-m, –monitor
接收到一个事情而不退出,无限期地执行。默认的行为是接收到一个事情后立即退出。
-d, –daemon
跟–monitor一样,除了是在后台运行,需要指定–outfile把事情输出到一个文件。也意味着使用了–syslog。
-o, –outfile
输出事情到一个文件而不是标准输出。
-s, –syslog
输出错误信息到系统日志
-r, –recursive
监视一个目录下的所有子目录。
-q, –quiet
指定一次,不会输出详细信息,指定二次,除了致命错误,不会输出任何信息。
–exclude
正则匹配需要排除的文件,大小写敏感。
–excludei
正则匹配需要排除的文件,忽略大小写。
-t , –timeout
设置超时时间,如果为0,则无限期地执行下去。
-e , –event
指定监视的事件。
-c, –csv
输出csv格式。
–timefmt
指定时间格式,用于–format选项中的%T格式。
–format
指定输出格式。
%w 表示发生事件的目录
%f 表示发生事件的文件
%e 表示发生的事件
%Xe 事件以“X”分隔
%T 使用由–timefmt定义的时间格式

inotifywatch

语法:
inotifywatch [-hvzrqf] [-e ] [-t ] [-a ] [-d ] [ … ]
参数:
-h, –help
输出帮助信息
-v, –verbose
输出详细信息
@
排除不需要监视的文件,可以是相对路径,也可以是绝对路径。
–fromfile
从文件读取需要监视的文件或排除的文件,一个文件一行,排除的文件以@开头。
-z, –zero
输出表格的行和列,即使元素为空
–exclude
正则匹配需要排除的文件,大小写敏感。
–excludei
正则匹配需要排除的文件,忽略大小写。
-r, –recursive
监视一个目录下的所有子目录。
-t , –timeout
设置超时时间
-e , –event
只监听指定的事件。
-a , –ascending
以指定事件升序排列。
-d , –descending
以指定事件降序排列。

可监听事件

access 文件读取
modify 文件更改。
attrib 文件属性更改,如权限,时间戳等。
close_write 以可写模式打开的文件被关闭,不代表此文件一定已经写入数据。
close_nowrite 以只读模式打开的文件被关闭。
close 文件被关闭,不管它是如何打开的。
open 文件打开。
moved_to 一个文件或目录移动到监听的目录,即使是在同一目录内移动,此事件也触发。
moved_from 一个文件或目录移出监听的目录,即使是在同一目录内移动,此事件也触发。
move 包括moved_to和 moved_from
move_self 文件或目录被移除,之后不再监听此文件或目录。
create 文件或目录创建
delete 文件或目录删除
delete_self 文件或目录移除,之后不再监听此文件或目录
unmount 文件系统取消挂载,之后不再监听此文件系统。

简单介绍RPM包制作方法

RPM是RedHat Package Manager(RedHat软件包管理工具)的缩写,是一种用于互联网下载包的打包及安装工具,它包含在某些Linux分发版中。它生成具有.RPM扩展名的文件。使用rpm安装软件和管理软件非常的方便。而这节我们不是介绍如何使用rpm安装或管理软件,而是如何把源码制作成rpm包。
下面我们以制作nginx的rpm开始介绍其制作方法。以下操作在centos-5 32系统进行。

制作nginx的rpm例子

1、建立目录结构

/usr/src/redhat/SOURCES — 存放源代码,补丁,图标等文件。
/usr/src/redhat/SPECS — 存放用于管理rpm制作进程的spec文件。
/usr/src/redhat/BUILD — 解压后的文件存放在这里。
/usr/src/redhat/RPMS — 存放由rpmbuild制作好的二进制包。
/usr/src/redhat/SRPMS —存放由rpmbuild制作好的源码包。

  1. mkdir -p /usr/src/redhat
  2. cd /usr/src/redhat
  3. mkdir SOURCES SPECS BUILD RPMS SRPMS

2、下载源码包

下载源码包到SOURCES目录,不需要解压。

  1. cd /usr/src/redhat/SOURCES
  2. wget http://nginx.org/download/nginx-1.2.1.tar.gz

3、创建Spec文件

  1. cd /usr/src/redhat/SPECS
  2. vi nginx.spec

内容如下:

  1. #
  2. # Example spec file for nginx
  3. #
  4. Summary: high performance web server
  5. Name: nginx
  6. Version: 1.2.1
  7. Release: 1.el5.ngx
  8. License: 2-clause BSD-like license
  9. Group: Applications/Server
  10. Source: http://nginx.org/download/nginx-1.2.1.tar.gz
  11. URL: http://nginx.org/
  12. Distribution: Linux
  13. Packager: zhumaohai <[email protected]>
  14.  
  15. %description
  16. nginx [engine x] is a HTTP and reverse proxy server, as well as
  17. a mail proxy server
  18. %prep
  19. rm -rf $RPM_BUILD_DIR/nginx-1.2.1
  20. zcat $RPM_SOURCE_DIR/nginx-1.2.1.tar.gz | tar -xvf –
  21. %build
  22. cd nginx-1.2.1
  23. ./configure –prefix=/usr/local/nginx
  24. make
  25. %install
  26. cd nginx-1.2.1
  27. make install
  28. %preun
  29. if [ -z "`ps aux | grep nginx | grep -v grep`" ];then
  30. killall nginx >/dev/null
  31. exit 0
  32. fi
  33. %files
  34. /usr/local/nginx

4、开始RPM制作

在制作RPM包之前需要安装必要的工具,如rpmbuild,gcc等。

  1. yum install gcc rpm-build pcre-devel
  1. cd /usr/src/redhat/SPECS/
  2. rpmbuild -bb nginx.spec

一切顺利的话,会生成nginx的rpm包,/usr/src/redhat/RPMS/i386/nginx-1.2.1-1.el5.ngx.i386.rpm。

5、测试rpm包

  1. rpm -ivh /usr/src/redhat/RPMS/i386/nginx-1.2.1-1.el5.ngx.i386.rpm

spec文件解释

从以上的简单例子可以看出,制作rpm包最重要的还是spec文件,下面解释一下例子所用到的指令。
#:以#开头是注释,rpm会忽略它。
Summary:简单描述软件。
Name :定义rpm的名称。
Version: 定义软件版本
Release: 发行版本
License: 定义许可证
Group: 软件分类
Source: 源码下载地址
URL: 源码相关网站
Distribution: 发行版系列
Packager: 打包人的信息

%description:软件详细描述,可多行
%prep :软件编译之前的处理,如解压。
%build :开始编译软件,如make
%install :开始安装软件,如make install
%files :指定哪些文件需要被打包,如/usr/local/nginx
%preun :定义卸载之前的动作,如杀掉进程。
这里只介绍了几个常用的tag,更详细的请参考:http://www.rpm.org/max-rpm/ch-rpm-inside.html

DSN: Service unavailable

自从换了vps,博客的评论邮件提醒功能一直有问题,今天有空,我们来解决它。
无法发送邮件的日志如下:

  1. Jun 26 07:24:23 MyVPS1976 sendmail[31760]: q5PNOMeP031760: from=<www@MyVPS1976>, size=1393, class=0, nrcpts=1, msgid=<[email protected]>, proto=SMTP, daemon=MTA, relay=MyVPS [127.0.0.1]
  2. Jun 26 07:24:25 MyVPS1976 sendmail[31762]: q5PNOMeP031760: to=<[email protected]>, ctladdr=<www@MyVPS1976> (501/501), delay=00:00:02, xdelay=00:00:02, mailer=esmtp, pri=121393, relay=mxdomain.qq.com. [64.71.138.90], dsn=5.0.0,stat=Service unavailable
  3. Jun 26 07:24:25 MyVPS1976 sendmail[31762]: q5PNOMeP031760: q5PNOPeP031762: DSN: Service unavailable
  4. Jun 26 07:24:25 MyVPS1976 sendmail[31762]: q5PNOPeP031762: to=root, delay=00:00:00, xdelay=00:00:00, mailer=local, pri=32578, dsn=2.0.0, stat=Sent

根据relay=mxdomain.qq.com. [64.71.138.90], dsn=5.0.0,stat=Service unavailable这一段,我们知道邮件已经发送出去,但由于某种原因邮件被拒绝,于是更换hostname,重启sendmail,解决问题。
更换hostname方法:
1、编辑/etc/sysconfig/network,更换文件中的hostnmae。
2、把hostname写入/etc/hosts
3、执行hostname devops.webres.wang立即生效

nginx 全局变量

经常需要配置Nginx ,其中有许多以 $ 开头的变量,经常需要查阅nginx 所支持的变量。
可能是对 Ngixn资源不熟悉,干脆就直接读源码,分析出支持的变量。
Nginx支持的http变量实现在 ngx_http_variables.c 的 ngx_http_core_variables存储实现:
Nginx
Nginx
Nginx
已Excel形式提供,方便查询:
http://files.cnblogs.com/AloneSword/nginx%E5%86%85%E7%BD%AE%E5%8F%98%E9%87%8F.rar
转自:http://www.cnblogs.com/AloneSword/archive/2011/12/10/2283483.html

rpmbuild在centos 5与centos 6用法的异同

之前是在centos 5上对软件进行rpm打包,今天需要在centos 6上打包,发现File not found: /root/rpmbuild/BUILDROOT/…的错误,看是centos 6中的rpmbuild topdir已经改变,为了能兼容centos 5的spec文件,需要对topdir进行修改:
打开/usr/lib/rpm/macros文件:

  1. %_topdir                %{getenv:HOME}/rpmbuild

更改为:

  1. %_topdir                %{_usrsrc}/redhat

另外还需要定义buildroot
在spec文件中的make install后面加上DESTDIR=%{buildroot},即:

  1. make install DESTDIR=%{buildroot}

DESTDIR是Makefile文件中定义的一个安装路径的变量,根据实际情况修改,比如mysql和nginx的是DESTDIR,而php的是INSTALL_ROOT。

修改xen vps系统时间

今天把博客vps搬到其它机房,连上新xen vps,修改时间,却怎么也不生效,特记录修改方法:

  1. cp -f /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
  2. echo "xen.independent_wallclock=1" >>/etc/sysctl.conf
  3. /sbin/sysctl -p
  4. echo "/sbin/ntpdate  cn.pool.ntp.org" >>/etc/rc.local
  5. ntpdate cn.pool.ntp.org

Linux简单处理CC攻击shell脚本

第一个脚本是通过查找日志中访问次数过多的ip,并用iptables屏蔽,600秒解封。

  1. #!/bin/bash
  2. btime=600
  3. attacks=20
  4. tmpBlockIPFile=/home/tmp_block_ip
  5. timestamp=$(date +%s)
  6. logPath="/home/ban.log"
  7.  
  8. #start detect bad ip
  9. badip=`tac /home/devops.webres.wang/access.log  | awk ‘
  10. BEGIN{
  11. cmd="date -d "1 minute ago" +%H%M%S"
  12. cmd|getline a
  13. }
  14. {
  15. $4 = substr($4,14,8)
  16. gsub(":","",$4)
  17. $4=$4+0
  18. a=a+0
  19. if ($4>=a){
  20. print $1,$7
  21. } else {
  22. exit;
  23. }
  24. }’ | egrep -v ‘.(gif|jpg|jpeg|png|css|js)’ | awk ‘{print $1}’ | sort | uniq -c | awk -v t="$attacks" ‘{$1=$1+0;t=t+0;if ($1>=t) print $2}’`
  25.  
  26. if [ ! -z "$badip" ];then
  27.     for ip in $badip;
  28.     do
  29.         if test -z "`/sbin/iptables -nL | grep $ip`";then
  30.             /sbin/iptables -I INPUT -s $ip -j DROP
  31.  
  32.             #record blocked ip
  33.             echo "$timestamp $ip" >> $tmpBlockIPFile
  34.             echo "$(date) $ip" >> $logPath
  35.         fi
  36.     done
  37. fi
  38.  
  39. #unblock ip
  40. if [ -f "$tmpBlockIPFile" ];then
  41.     ips=""
  42.     while read blockTime ip
  43.     do
  44.         ((interval=$timestamp – $blockTime))
  45.         if [ $interval -gt $btime ];then
  46.             ips="$ips $ipn"
  47.         fi   
  48.     done < $tmpBlockIPFile
  49.  
  50.     if [ "$ips" != "" ];then
  51.         for ip in `echo -e $ips`
  52.         do
  53.             sed -i "/$ip/d" $tmpBlockIPFile
  54.             /sbin/iptables -D INPUT -s $ip -j DROP
  55.         done
  56.     fi
  57. fi

将此代码保存为ban.sh,加入cronjob使每分钟执行一次。
此脚本的作用是:利用iptables屏蔽每分钟访问页面超过20的IP,这些页面已经排除图片,css,js等静态文件。
第二个脚本是通过在日志中查找cc攻击的特征进行屏蔽。

  1. #!/bin/bash
  2. keyword="cc-atack"
  3. badip=`tail -n 5000  /home/devops.webres.wang/log/access.log | grep "$keyword"  | awk ‘{print $1}’ | sort | uniq -c | sort -nr | awk ‘{print $2}’`
  4. if [ ! -z "$badip" ];then
  5. for ip in $badip;
  6. do
  7. if test -z "`/sbin/iptables -nL | grep $ip`";then
  8. /sbin/iptables -I INPUT -s $ip -j DROP
  9. fi
  10. done
  11. fi

keyword则是日志中cc的特征,替换成有效的即可。

配置apache运行cgi程序

配置apache运行cgi程序可分为两种情况,一是ScriptAlias目录的CGI,二是ScriptAlias以外目录的CGI。

ScriptAlias目录的CGI

ScriptAlias指令使Apache允许执行一个特定目录中的CGI程序。当客户端请求此特定目录中的资源时,Apache假定其中文件都是CGI程序并试图运行。
ScriptAlias指令形如:

  1. ScriptAlias /cgi-bin/ /usr/local/apache/cgi-bin/

ScriptAlias目录以外的CGI

由于安全原因,CGI程序通常被限制在ScriptAlias指定的目录中,如此,管理员就可以严格地控制谁可以使用CGI程序。但是,如果采取了恰当的安全方法措施,则没有理由不允许其他目录中的CGI程序运行。比如,你可能希望用户在UserDir指定的宿主目录中存放页面,而他们有自己的CGI程序,但无权存取cgi-bin目录,这样,就产生了运行其他目录中CGI程序的需求。
1、用Options显式地允许CGI的执行
可以在主服务器配置文件中,使用Options指令显式地允许特定目录中CGI的执行:

  1. <Directory /usr/local/apache/htdocs/somedir>
  2. Options +ExecCGI
  3. </Directory>

上述指令使Apache允许CGI文件的执行。另外,还必须告诉服务器哪些文件是CGI文件。下面的AddHandler指令告诉服务器所有带有cgi或pl后缀的文件是CGI程序:

  1. AddHandler cgi-script cgi pl

2、.htaccess文件
.htaccess文件是针对目录进行配置的一种方法。Apache在提供一个资源时,会在此资源所在目录中寻找.htaccess文件,如果有,则使其中的指令生效。AllowOverride 指令决定了.htaccess文件是否有效,它指定了哪些指令可以出现在其中,或者根本不允许使用。为此,需要在主服务器配置中如此配置:

  1. AllowOverride Options

在.htaccess文件中,需要如此配置:

  1. Options +ExecCGI

以使Apache允许此目录中CGI程序的执行。
最后可以编写一个cgi程序测试,如:

  1. #!/usr/bin/perl
  2. print "Content-type: text/htmlnn";
  3. print "Hello, World.";

参考:http://lamp.linux.gov.cn/Apache/ApacheMenu/howto/cgi.html

centos安装或修复grub引导

有时候我们使用u盘安装linux系统,不小心把grub安装到u盘,导致引导需要插入u盘才能启动服务器,或者grub损坏,这时需要重新安装grub到硬盘。

安装grub方法1

指定/boot分区

  1. grub> root (hd0,0)

如果不确定/boot是在哪个分区,使用下面的命令找出。

  1. grub> find /boot/grub/stage1

安装grub到第一硬盘的MBR。

  1. grub> setup (hd0)

或者安装grub到第一硬盘第一分区引导扇区。

  1. grub> setup (hd0,0)

安装grub方法2

  1. # grub-install –root-directory=/boot /dev/hda

使用grub手动引导linux和windows

引导Linux

重启进入到grub菜单界面时,按“c”键进入grub命令模式。
1、指定/boot所在的分区,比如分区是第一块硬盘第一分区,即hd0,0

  1. grub> root (hd0,0)

2、指定kernel。

  1. grub> kernel /vmlinuz

3、指定initrd。

  1. grub> initrd /initrd

4、开始引导。

  1. grub> boot

引导windows

重启进入到grub菜单界面时,按“c”键进入grub命令模式。

  1. grub> rootnoverify (hd0,0)
  2. grub> chainloader +1
  3. grub> makeactive
  4. grub> boot