shell脚本+mysql数据库组合进行数据安全监控

shell脚本 + mysql数据库 实现企业级会话边界控制器文件解析并告警


dirsx30001.sh处理文件,生成mysql备份文件的方式进行导入

#/bin/bash
##环境变量
path=/home/sbclog/sx30001
##由于抓取的日志文件中没有年份参数,故导入系统年份参数,以达到数据库时间字段datetime
##也可以抓取tar包的名字中的字段
date_year=`date|cut -c 25-`
#test ! -e $path/*.tar &&echo "[ "`date`" ] no search the tar file">>$path/dir.log&&exit 0
##遍历日志文件tar包,进行解包,保存了文件的全路径,及文件名
for a in `ls $path/*.tar 2>>/dev/null`
do
  ##输出当前解包的文件tar
  echo $a
  tar -xf $a -C $path
  ##解完包,将tar文件进行转移
  mv $a $path/backup/
  ##执行解析程序foundall,生成BYE.txt和INVITE.txt解析文件
  /data/sbc1/foundall $path/
  ##删除包文件
  rm -rf $path/var
  #echo $b
  ##判断解析文件是否为NULL
  FILEBYE=`sed -n '$=' $path/BYE.txt`
  FILEINVITE=`sed -n '$=' $path/INVITE.txt`
##BYE
  if [ ! -n "$FILEBYE" ]; then
    echo "[ "`date`" ] no BYE in $a">>$path/dir.log
  else
  echo "use sbc;" > $a.BYE.sql
  echo "insert into sbc1bye values" >> $a.BYE.sql
  ##################
  awk '{print "('\'$date_year/'"$1" "$2"'\'','\''"$3"'\'','\''"$4"'\'','\''"$5"'\'','\''"$6"'\'','\''"$7"'\'','\''"$8"'\'','\''"$9"'\''),"}' $path/BYE.txt >>$a.BYE.sql
  ##替换最后一行的最后一个字符为分号
  sed -i '$s/.$/;/g' $a.BYE.sql
  #sed -i 's/\//-/g' $a.BYE.sql
  ##导入数据库
  mysql -usbc_user -p123456 <$a.BYE.sql
  ##保存文件
  mv $a.BYE.sql $path/BYEsql/
##INVITE
  fi
  if [ ! -n "$FILEINVITE" ]; then
    echo "[ "`date`" ] no INVITE in $a">>$path/dir.log
  else
  echo "use sbc;" > $a.INVITE.sql
  echo "insert into sbc1invite values" >> $a.INVITE.sql
  ##################
  awk '{print "('\'$date_year/'"$1" "$2"'\'','\''"$3"'\'','\''"$4"'\'','\''"$5"'\'','\''"$6"'\'','\''"$7"'\'','\''"$8"'\'','\''"$9"'\''),"}' $path/INVITE.txt >>$a.INVITE.sql
  ##替换最后一行的最后一个字符为分号
  sed -i '$s/.$/;/g' $a.INVITE.sql
  #sed -i 's/\//-/g' $a.INVITE.sql
  ##导入数据库
  mysql -usbc_user -p123456 <$a.INVITE.sql
  ##保存文件
  mv $a.INVITE.sql $path/INVITEsql/
  fi
done


数据库设计,把接受信息和接通信息分开来管理。

--sbc1bye表设计,使用了大量varchar类型存取数据,节省空间,type使用了char类型提升检索效率(原计划是BYE和INVITE保存在同一个表中)。
CREATE TABLE `sbc1bye` (
  `time` DATETIME DEFAULT NULL,
  `from` varchar(255) DEFAULT NULL,
  `to` varchar(255) DEFAULT NULL,
  `type` char(10) DEFAULT NULL,
  `server` varchar(255) DEFAULT NULL,
  `caller` varchar(255) DEFAULT NULL,
  `called` varchar(255) DEFAULT NULL,
  `callid` varchar(255) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

CREATE TABLE `sbc1invite` (
  `time` DATETIME DEFAULT NULL,
  `from` varchar(255) DEFAULT NULL,
  `to` varchar(255) DEFAULT NULL,
  `type` char(10) DEFAULT NULL,
  `server` varchar(255) DEFAULT NULL,
  `caller` varchar(255) DEFAULT NULL,
  `called` varchar(255) DEFAULT NULL,
  `callid` varchar(255) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;


通过设置视图去除重复消息。也可以灵活的添加各种条件。

--通过视图限制条件,更为灵活多变
CREATE OR REPLACE
    VIEW sbc1bye_v
    AS select distinct `time` btime,`from` bfrom,`to` bto,`type` btype,`server` bserver,`caller` bcaller,`called` bcalled,`callid` bcallid from sbc1bye group by `callid`;

--通过视图限制条件,更为灵活多变
CREATE OR REPLACE
    VIEW sbc1invite_v
    AS select distinct `time` btime,`from` bfrom,`to` bto,`type` btype,`server` bserver,`caller` bcaller,`called` bcalled,`callid` bcallid from sbc1invite group by `callid`;


进行检查数据库中的数据是否到达告警值。

#!/bin/bash

##导入变量,变量在多个会话中漂移root
. /root/.bash_profile

##通知邮箱数组
a=(
[email protected]  #实验证明139移动邮箱,响应速度奇慢,建议使用163邮箱
)

##邮件内容保存路径
mailpath=/home/sbclog/sx30001

##告警值
value_limit=200

#mysql -usbc_user -p123456 -e "use sbc;select * from heji where heji>$value_limit;">$mailpath/mail.log 

##生成NULL的邮件内容文件
>$mailpath/mail.log
#echo "$SCN_time_sx30002"

##产生告警的数据文件,可以修改为select where having
mysql -usbc_user -p123456 -e "use sbc;select a.* from (select bcaller,bcalled,count(bcalled) heji from  sbc1bye_v where btime>$SCN_time_sx30001 group by bcaller,bcalled) a where a.heji>$value_limit;">$mailpath/mail.log

##判断邮件内容文件是否为NULL
FILEMAIL=`sed -n '$=' $mailpath/mail.log`

if [ ! -n "$FILEMAIL" ]; then
  #echo "no value over the limit,so no mail will be sent."

  ##为NULL文件时,重置定时文件/var/spool/cron/root为每分钟检查
  sed -i 's/\*\/30 \* \* \* \* \/bin\/bash \/home\/sbclog\/mailsx30001.sh/\* \* \* \* \* \/bin\/bash \/home\/sbclog\/mailsx30001.sh/g' /var/spool/cron/root

else

  ##将邮件内容content文件处理成html表格文件,适合观察
  sed 's/\t/\<\/th\>\<th\>/g' $mailpath/mail.log |sed 's/^/\<tr\>\<th\>/g'|sed 's/$/\<\/td\>\<\/tr\>/g'|sed '1s/^/<table border="1">/g'|sed '$s/$/<\/table>/g'>$mailpath/mail.html

  #echo ${#a[@]}

  ##不为NULL文件时,设置定时文件/var/spool/cron/root为30分钟再次告警,直至人为处理
  sed -i 's/\* \* \* \* \* \/bin\/bash \/home\/sbclog\/mailsx30001.sh/\*\/30 \* \* \* \* \/bin\/bash \/home\/sbclog\/mailsx30001.sh/g' /var/spool/cron/root

  ##遍历数组发送邮件
  for mail in ${a[*]}
    do
      ##html格式发送,可以设计邮件样式
      mail -s "$(echo -e "SBC1 Exception Information\nContent-Type:text/html")" $mail < $mailpath/mail.html
  done
fi


工作人员确认数据为正常时,执行(恢复时间点,防止查询数据时间范围过大)。

#export SCN_time_sx30002="'"`date +%F" "%T`"'"
#sed -i 's/export SCN_time_sx30002.*/export SCN_time_sx30002=\"\'`date +%F" "%T`\'\"/'  /root/.bash_profile
#sed -i 's/date_sub(now(),interval 1 day)/"'"`date +%F" "%T`"'"/'  /root/.bash_profile

##将环境变量在各个会话中传递
sed -i "s/export SCN_time_sx30001.*/export SCN_time_sx30001='`date +%F" "%T`'/" /root/.bash_profile

#echo "restore success. now:"$SCN_time_sx30001
#at now + 1 day -f /home/sbclog/resx30002.sh
#at now + 1 min -f /home/sbclog/resx30002.sh

##at一次性定时任务,检查的为前一天的告警是否合适,故恢复时间点+了一个小时
at now + 25 hours -f /home/sbclog/resx30001.sh

恢复时,执行的脚本

#sed -i 's/nnn/ggg/g' /home/sbclog/122.txt
#sed -i 's/date_sub(now(),interval 1 day)/"'"`date +%F" "%T`"'"/'  /root/.bash_profile

##恢复时间点,使检查点恢复成一天告警
sed -i 's/export SCN_time_sx30001.*/export SCN_time_sx30001="date_sub(now(),interval 1 day)"/'  /root/.bash_profile


你可能感兴趣的:(mysql,数据库,search,控制器,数据安全)