shell腳本監控服務器進程和端口 & 其他自動化shell腳本


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

腳本實現了,當檢測網頁狀態碼大於等於500連續出現3次數,自動重啟tomcat6,且只連續重啟兩次。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM