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
时间: 2024-11-29 01:32:22

shell脚本+mysql数据库组合进行数据安全监控的相关文章

Saiku数据库迁移后的刷新脚本-Shell脚本读取数据库中的数据(二十三)

Saiku数据库迁移后的刷新脚本 之前有谈过对saiku中的数据进行刷新,因为saiku默认会从缓存中查询数据,但是配置不使用缓存又会效率低下... 所以这里就需要做一个数据刷新,每次ETL之后都需要执行一遍数据刷新脚本. 刷新脚本主要分为两部分 1.使用shell命令从数据库中读取已有的用户信息 (因为已经做过数据迁移,数据库已经从h2转为我们自己的mysql) saikuRefresh.sh #!/bin/bash #数据库连接信息 HOSTNAME="10.11.22.33" #

shell脚本操作数据库

#!/bin/bash HOST_NAME="localhost" PORT=3306 USERNAME="root" PASSWORD="root" DBNAME="test" TABLENAME="tb_test" today=`date +%Y-%m-%d` #删除数据 delete_sql="delete from ${TABLENAME} where todaytime!= '${tod

使用shell脚本生成数据库markdown文档

学习shell脚本编程的一次实践,通过shell脚本生成数据库的markdown文档,代码如下: HOST=xxxxxx PORT=xxxx USER="xxxxx" PASSWORD="xxxxxx" DATABASE_PREFIX="xxxxxx" QUERY_DATABASE="select distinct TABLE_SCHEMA from information_schema.TABLES where TABLE_TYPE=

【转】mysql数据库读写分离数据同步

转载请注明来源:mysql数据库读写分离数据同步 mysql数据库读写分离数据同步 我是用了两个xp(一个主的,一个从的)的系统测试成功的,linux系统我也做测试了,没有成功,不过我想我所遇到的问题是同一个问题,xp下的可以成功,linux下的应该也可以成功,稍候会测试,然后更新结果! PS:刚测试了下linux 可以同步成功,主服务器是xp,从服务器是centos,可以成功. 例: A机器 192.168.0.2 B机器 192.168.0.3 两个机器可以ping通,互相访问 先配置主服务

OpenLayers添加点【php请求MySQL数据库返回GeoJSON数据】

php请求MySQL数据库返回GeoJSON数据的实现方法请参见: http://www.cnblogs.com/marost/p/6234514.html OpenLayers[v3.19.1-dist]添加GeoJSON数据源图层 <!doctype html> <html lang="en"> <head> <link rel='stylesheet' href='ol.css'> <style> #map { heig

EF 连接MySQL 数据库 ?保存中文数据后乱码问题

EF 连接MySQL 数据库  保存中文数据后乱码问题 采用Code First 生成的数据库,MySQL数据库中,生成的表的编码格式为***** 发现这个问题后,全部手动改成UTF8(图是另一个表的图),否则插入的数据,就会全部变成乱码 修改后可以正常插入数据(注意!!这里是直接用SQL 代码插入的数据) 之后用代码界面保存数据,如图 但数据中却变成乱码: 修改方法: 在连接MySQL的连接字符串中,加入配置文件信息:Character Set=utf8  来自为知笔记(Wiz)

shell操作mysql数据库模板

在工作中,常用shell操作mysql数据库,为了方便,基本模板 时间处理方式(有时关联表时间格式不一样) date=$1 date1=${date//-/} if [ x$date = x ] then date=`date -d "yesterday" +%Y-%m-%d` date1=`date -d "yesterday" +%Y%m%d` fi echo "select begin: `date '+%Y-%m-%d %H:%M:%S'`&quo

MySQL数据库表的数据插入、修改、删除操作及实例应用

1.MySQL数据库表的数据插入.修改.删除操作SQL语法格式: 1 CREATE DATABASE db0504; 2 3 USE db0504; 4 5 CREATE TABLE student ( 6 sno VARCHAR (10) NOT NULL UNIQUE PRIMARY KEY, 7 sname VARCHAR (20) NOT NULL, 8 ssex enum ('男', '女') NOT NULL DEFAULT '男', 9 sbirth date, 10 sclass

使用Sqoop1.4.4将MySQL数据库表中数据导入到HDFS中

问题导读:         1.--connect参数作用? 2.使用哪个参数从控制台读取数据库访问密码? 3.Sqoop将关系型数据库表中数据导入HDFS基本参数要求及命令? 4.数据默认导入HDFS文件系统中的路径? 5.--columns参数的作用? 6.--where参数的作用? 一.部分关键参数介绍 参数介绍 --connect <jdbc-uri> 指定关系型数据库JDBC连接字符串 --connection-manager <class-name> 指定数据库使用的管