shell脚本监控服务器进程和端口

最近学习shell编程中,写了个脚本,可以监控当前服务器使用的端口,PID,程序名称等;可以用于发现是否有不常用的端口被侦听,进而判断是否被黑客“搞”了;

代码如下:

#tcp part
port1=`netstat -an|grep LISTEN|egrep "0.0.0.0|:::"|awk '/^tcp/ {print $4}'|awk -F: '{print $2$4}'|sort -n`
echo "TCP state:"
echo "--------------------------------"
echo "PORT      PID     COMMAND"
for a in $port1
do
b=`lsof -n -i:$a|grep TCP|grep LISTEN|grep IPv4|awk '{printf("%d\t%s\n"),$2,$1}'`
echo "$a        $b"
done
echo "--------------------------------"

#udp part
echo ""
port2=`netstat -an|grep udp|awk '{print $4}'|awk -F: '{print $2}'|sed '/^$/d'|sort -n`
echo "UDP state:"
echo "--------------------------------"
echo "PORT      PID     COMMAND"
for a in $port2
do
b=`lsof -n -i:$a|grep UDP|grep IPv4|awk '{printf("%d\t%s\n"),$2,$1}'`
if [ -n "$b" ];then
echo "$a        $b"
fi
done
echo "--------------------------------"

exit 0

 

 

 

有很多时候需要检查网络服务是否正常,以下是几种常用的方法。

       1.telnet

#/bin/sh
. /etc/init.d/functions
if [ $# -ne 1 ]
then
     echo "Usage: sh $1 ip"
     exit
fi
num=`echo -n "\n"|telnet $1 80|grep Connected|wc -l`
if [ $num -eq 1 ]
then
      action "network is open." /bin/true
else
       action "network is closed." /bin/false
fi

2.curl

#!/bin/sh
[ $# -ne 1 ] && echo "Usage: sh $0 IP"
[ -f /etc/init.d/functions ] && . /etc/init.d/functions||exit 1
ReturnCode=`curl -I -s $1|head -1|cut -d" " -f2`
[ "$Code" == "200" ] && action "$1 is open." /bin/true || action "$1 is closed." /bin/false

 

 

 

监视磁盘使用情况的Shell脚本(本地+远程)

monitordisk.sh如下

#!/bin/bash
#Updated:2008-03-03 PM By:leif(liangliwen@163.com)
EMAIL=/usr/local/bin/email
/bin/df -h >/tmp/df.txt

USE=`df -H | grep -o [0-9]*% | grep -o ‘[0-9]\+'`

for i in $USE
do
if (( $i > 95 ))
then
$EAMIL -s “WARNING Low disk space for $i” liangliwen@163.com break
fi
if (( $i > 90 ))
then
$EMAIL -s “Low disk space for $i” liangliwen@163.com fi
done

/bin/rm -f /tmp/df.txt

实现目的,任何一个分区使用到90%就发送一个邮件给指定的收件人,到95%就在邮件主题出警告(warning),说明发送邮件程序EMAIL,是从http://www.cleancode.org/projects/email 下载安装,比较灵活.

把这个shell根据需要放在crontab 实现定时检查磁盘情况

以下是补充内容:

用于监视远程主机磁盘使用情况的shell脚本,文件名:disklog.sh

#!/bin/bash
# 文件名:disklog.sh
# 用途:监视远程系统的磁盘使用情况
logfile="diskusage.log"
if [[ -n $1 ]]
then
logfile=$1
if
if [ ! -e $logfile ]
then
printf "%-8s %-14s %-9s %-8s %-6s %-6s %-6s %s\n" "Date" "IP ADDRESS" "Device" "Capacity" "Used" "Free" "Percent" "Status" > $logfile
fi

IP_LIST="127.0.0.1 0.0.0.0"
# 提供远程主机IP地址列表
(
for ip in $IP_LIST
do
ssh slynux@$ip 'df -H' | grep ^/dev/ > /tmp/$$.df

while read line;
do
cur_date=$(date +%D)
printf "%-8s %-14s " $cur_date $ip
echo $line | awk '{ printf("%-9s %-8s %-6s %-6s %-8s", $1,$2,$3,$4,$5); }'

pusg=$(echo $line | egrep -o "[0-9]+%")
pusg=${pusg/\%/};
if [ $pusg -lt 80 ];
then
echo SAFT
else
echo ALERT
fi
done< /tmp/$$.df
done
)>>$logfile

我们可以用cron以固定的间隔来调度脚本执行,例如在crontab中加入如此条目,以实现每天上午10点自动运行脚本:


00 10 * * * /home/sh/disklog.sh /home/log/diskusg.log

执行crontab -e命令,添加上面一行内容并保存。

也可以手动执行:

$ ./disklog.sh

 

获取同一网段下所有机器MAC地址的shell脚本

代码如下:

#!/bin/bash
for ((i = 1; i < 254; i++))
do
arping -I eth0 192.168.0.$i -c 1
done
arp -a > /tmp/mactable.txt

那个/tmp/mactable.txt文件即同一网段下所有机器IP/MAC对应地址

 

智能监测自动重启Apache服务器的Shell脚本

由于需要监控某些要求高可用性的Apache服务器,除了专业的监控报警设备,低成本下在Apache服务器上写一个自动监测Apache状态的脚本是个不错的主意。在网上搜索了许多类似的脚本,但由于局限性较大,也都存在一些不完善的地方,所以自己写了一个。

脚本功能与特点

1、能够每隔一段时间监测Apache服务器的可用性(由于本脚本直接模拟了客户端的访问,因此这里的“可用性”是指切切实实的正常可访问)
2、在出现无法访问的情况下,能够自动重启Apache服务(强行重启)
3、在重启后仍然无法正常访问的话,自动执行更进一步的操作(比如发送邮件、重启服务器等)
后文将给出此脚本的具体使用方法与注释,大家可以根据自己的情况手动修改(需了解一定bash shell编程)。

脚本内容:

#!/bin/bash
URL=”http://127.0.0.1/”
curlit()
{
curl –connect-timeout 15 –max-time 20 –head –silent “$URL” | grep '200′
# 上面的15是连接超时时间,若访问localhost的HTTP服务超过15s仍然没有正确响应200头代码,则判断为无法访问。
}
doit()
{
if ! curlit; then
# 如果localhost的apache服务没有正常返回200头,即出现异常。执行下述命令:
sleep 20
top -n 1 -b >> /var/log/apachemonitor.log
# 上面将top命令内容写入日至文件备查
/usr/bin/killall -9 apache2 && /usr/bin/killall -9 php5-cgi && /usr/bin/killall -9 httpd && /usr/bin/killall -9 http && /usr/bin/killall -9 apache && /usr/bin/killall -9 php-cgi > /dev/null
# 兼容起见,杀死了各种apache的进程。可以根据自己apache服务的特点修改
sleep 2
/etc/init.d/apache2 start > /dev/null
/etc/init.d/httpd start > /dev/null
# 兼容起见,执行了两种apache重启命令,可根据需要自己修改。
echo $(date) “Apache Restart” >> /var/log/apachemonitor.log
# 写入日志
sleep 30
# 重启完成后等待三十秒,然后再次尝试一次
if ! curlit; then
# 如果仍然无法访问,则:
echo $(date) “Failed! Now Reboot Computer!” >> /var/log/apachemonitor.log
# 写入apache依然重启失效的日志
reboot
# 重启机器呗。实际上重启整个服务器是一种非常不得已的做法。本人并不建议。大家根据需要自己修改,比如短信、邮件报警什么的。
fi
sleep 180
fi
}
sleep 300
# 运行脚本后5分钟后才开始正式工作(防止重启服务器后由于apache还没开始启动造成误判)
while true; do
# 主循环体
doit > /dev/null
sleep 10
done

使用方法
使用方法非常灵活,总之让上面的脚本在开机后一直执行就行了。由于脚本使用了curl命令,因此还需要安装curl环境。安装curl的方法:
根据发行版选择下面两条命令即可

yum install curl
apt-get install curl

若希望将其自动启动,则可以把脚本写入rc.local中即可。

 

 

自动重启服务的shell脚本代码

 

#!/bin/bash
if [ ! -f /tmp/down_count ];then
echo "0" > /tmp/down_count
fi
curl -I tomcat-host -o "/tmp/status" >/dev/null 2>&1
code=`awk 'NR==1 {print $2}' /tmp/status`
if [ "$[code]" -ge 500 ];then
down=`expr $(cat /tmp/down_count) + 1`
echo "$down" > /tmp/down_count
if [ "$down" -gt 3 ];then
if [ ! -f "/tmp/restart_count" ];then
echo "0" > /tmp/restart_count
fi
restart_count=`expr $(cat /tmp/restart_count) + 1`
echo "$restart_count" > /tmp/restart_count
if [ "$restart_count" -le 2 ];then
echo "tomcat down at `date`" >> /tmp/down_info
/etc/init.d/tomcat6 restart
fi
fi
else
echo "0" > /tmp/down_count
echo "0" > /tmp/restart_count
fi

脚本实现了,当检测网页状态码大于等于500连续出现3次数,自动重启tomcat6,且只连续重启两次。