日志自动生成脚本
① 如何shell命令编写自己的Web日志分析脚本
一、读取文件
按照上面的思路,先解决读取问题。这里我用了判断语句,起初我是想写出类似于 access=more
/usr/access*.*,将这个路径全部加到变量里,方便判断,因为在shell里,只能将固定文件、文件夹作为变量,变量中不能加*号(我是没找到别的方法,有知道大牛请提点下小弟),所以就想了个笨办法,用匹配关键词的方式来判断特定目录下,是apache日志,还是weblogic日志,还是IIS日志,具体判断方法如下:
if ls -l /usr/ | egrep "access";then
more /usr/access*.* | egrep "多个关键词"
else
more /usr/ex*.log | egrep “多个关键词”
fi
这样的方式来进行判断,但是这样判断有个缺点,就是中间件日志在/usr/目录下,只能存在一种,比如同时存在apache和IIS的日志,就会优先判断apache的,进而不会执行IIS日志分析的语句。而且,为了不跟之前的历史数据混乱,在脚本执行开始,清空了下数据。
file=/usr/nmgxy/
if [ -e "$file" ];then
echo "日志目录存在,跳过创建过程,该操作会清空/usr/nmgxy/目录下所有数据"
echo "按回车键开始清空数据,结束请点击Ctrl+c"
read key
rm -r /usr/nmgxy/*
mkdir -p /usr/nmgxy/LFI/ /usr/nmgxy/exp/ /usr/nmgxy/sql/ /usr/nmgxy/scan/ /usr/nmgxy/xss/ /usr/nmgxy/getshell/ /usr/nmgxy/dir/
else
mkdir -p /usr/nmgxy/ /usr/nmgxy/LFI/ /usr/nmgxy/exp/ /usr/nmgxy/sql/
/usr/nmgxy/scan/ /usr/nmgxy/xss/ /usr/nmgxy/getshell/ /usr/nmgxy/dir/
fi
echo "分析结果日志保存在/usr/nmgxy/目录下"
echo ---------------------日志目标文件---------------------------
if ls -l /usr/ | egrep "access";then
echo --------------------统计出现次数最多的前20个IP地址-----------------
cat /usr/access*.* |awk '{print $1}' |sort |uniq -c |sort -rn |head -20 >/usr/nmgxy/top20.log
echo "统计完成"
二、定义攻击特征
日志读取的问题解决了,接下来就是定义攻击特征的事儿了,攻击特征比较好定义。例如,SQL注入攻击的判断:
echo ------------------------SQL注入攻击sql.log----------------
echo "开始分析存在SQL注入的攻击行为,并将结果保存在/usr/nmgxy/sql/目录下"
more /usr/access*.* |egrep
"%20select%20|%20and%201=1|%20and%201=2|%20exec|%27exec|
information_schema.tables|%20information_schema.tables|%20where%20|%20union%20|%20SELECT%20|%2ctable_name%20|cmdshell|%20table_schema"
>/usr/nmgxy/sql/sql.log
echo "分析结束"
awk '{print "共检测到SQL注入攻击" NR"次"}' /usr/nmgxy/sql/sql.log|tail -n1
echo "开始统计SQL注入攻击事件中,出现频率最多的前20个IP地址"
cat /usr/nmgxy/sql/sql.log |awk -F "[" '{print $1}' |sort |uniq -c |sort -rn |head -20 >/usr/nmgxy/sql/top20.log
echo ----------------------------------------------------------
more /usr/nmgxy/sql/top20.log
echo "统计结束"
我把一些常见的SQL注入攻击的特征写到了里面,去掉了MSSQL数据库存储过程以及MSSQL数据库才会出现的一些注入语句。
三、输出匹配到的含有攻击特征的记录
将匹配到的攻击特征内容,重新输出到了另外一个log里面,相当于做了一次筛选/usr/nmgxy/sql/sql.log
more /usr/access*.* |egrep
"%20select%20|%20and%201=1|%20and%201=2|%20exec|%27exec|
information_schema.tables|%20information_schema.tables|%20where%20|%20union%20|%20SELECT%20|%2ctable_name%20|cmdshell|%20table_schema"
>/usr/nmgxy/sql/sql.log
然后二次分析这个筛选过的文件,统计SQL注入攻击出现的次数
awk '{print "共检测到SQL注入攻击" NR"次"}' /usr/nmgxy/sql/sql.log|tail -n1
输出完毕后,将攻击出现最多的前20个IP地址进行统计并显示到屏幕上
echo "开始统计SQL注入攻击事件中,出现频率最多的前20个IP地址"
cat /usr/nmgxy/sql/sql.log |awk -F "[" '{print $1}' |sort |uniq -c |sort -rn |head -20 >/usr/nmgxy/sql/top20.log
echo ----------------------------------------------------------
more /usr/nmgxy/sql/top20.log
echo "统计结束"
四、输出结果
这个在代码开头,创建了一些文件夹,用来存放筛选过的记录
mkdir -p /usr/nmgxy/LFI/ /usr/nmgxy/exp/ /usr/nmgxy/sql/ /usr/nmgxy/scan/ /usr/nmgxy/xss/ /usr/nmgxy/getshell/ /usr/nmgxy/dir/
中间删删改改折腾了好几次。后来针对特定的攻击,我们比较关注(重点是比较好写的= =)的内容做了HTTP响应请求200/500的判断,并输出结果。
echo -------------------------getshell-getshell.log----------------
echo "开始分析存在getshell的攻击行为,并将结果保存在/usr/nmgxy/getshell/目录下"
more /usr/access*.* |egrep "
eval|%eval|%execute|%3binsert|%20makewebtaski%20|/div.asp|/1.asp|/1.jsp|/1.php|/1.aspx|xiaoma.jsp|tom.jsp|py.jsp|k8cmd.jsp|/k8cmd|ver007.jsp|ver008.jsp|ver007|ver008|%if|\.aar"
>>/usr/nmgxy/getshell/getshell.log
echo "分析结束"
echo "二次分析结果中HTTP响应码为200和500,结果另存为/usr/nmgxy/getshell/ok.log"
more /usr/nmgxy/getshell/getshell.log | awk '{if($9=200) {print $1" "$2"
"$3" "$4" "$6" "$7" "$8" "$9}}' >/usr/nmgxy/getshell/ok.log
more /usr/nmgxy/getshell/getshell.log | awk '{if($9=500) {print $1" "$2"
"$3" "$4" "$6" "$7" "$8" "$9}}' >>/usr/nmgxy/getshell/ok.log
echo "二次分析结束"
awk '{print "共检测到getshell行为" NR "次"}' /usr/nmgxy/getshell/getshell.log|tail -n1
echo "开始统计漏洞利用攻击事件中,出现频率最多的前20个IP地址"
cat /usr/nmgxy/getshell/getshell.log |awk -F "[" '{print $1}' |sort
|uniq -c |sort -rn |head -20 >/usr/nmgxy/getshell/top20.log
echo ---------------------------------------------------------------
more /usr/nmgxy/getshell/top20.log
echo "统计结束"
统计HTTP响应状态,IIS和apache有点区别。apache我以默认空格为分隔符,判断第9个分隔符是否为200或500,如果等于,则输出全部内容
more /usr/nmgxy/getshell/getshell.log | awk '{if($9=500) {print $1" "$2" "$3" "$4" "$6" "$7" "$8" "$9}}'
而IIS的,我则是用获取关键词的方式,来进行判断。
more /usr/nmgxy/getshell/getshell.log | egrep " 200" >/usr/nmgxy/getshell/ok.log
用egrep的方式,关键词为" 200",200前面有个空格,如果不加空格的话,很容易跟其他的参数混起来,那个时候误报就不是一点点了。例如asp?id=200,所以加入了空格做区分。
IIS和nginx的思路类似,唯一的区别就是特征码,稍微有点改动而已,这个就不一一例举了。思路就是这个思路,其实后期想把报告整体输出成HTML的方式,估计工作量挺大,这个还是得闲下来的时候,慢慢修改吧。
PS:这个脚本虽然写的比较粗糙,但是精确度还是有的,测试了几十次,精确度能达到至少80%以上。
分析1个多G的日志文件,需要大致约30多秒左右,我是在虚拟机里做的测试。虚拟机ubuntu系统,1G的内存。
不见得能帮上大忙,至少可以给大家在分析日志时节省点时间。。。。
先贴出apache、weblogic、IIS的脚本代码,weblogic的从网盘直接下载就好。apache、weblogic、IIS的脚本代码:
② 如何写一个复制删除的日志的脚本
最后会为log后面数字纠结半天的,建议直接从C盘 log到D盘指定路径,重命名为log+日期时间,并删除最早的那个日志文件。dos 批处理几行就能搞定。
③ linux系统中,我部署的应用,想让它的日志每天生成一个,类似2014-08-06.log
:nohup XXXX>XXX.log &
:nohup XXXX>`date `.log &
date 可以格式化
man date
④ 我在java中用下面方法执行sql脚本,不输出日志,但是在命令窗口执行就会生成脚本
楼主,那你是什么问题呢?是要输出日志、还是说不要在命令窗口显示脚本呢。
另外,说实在的,既然使用了JAVA,不如使用JDBC来执行,读入文件、分段执行。
⑤ crontab 的定时任务执行的脚本,有办法把执行情况生成日志吗
直接crontab -e添加执行脚本,然后给执行脚本加个重定向到文件就行了。例如:30 23 * * * /path/to/shell/script >> /path/to/log/file #表示每晚的23:30执行/path/to/shell/script脚本,并且把结果重定向输出到/path/to/log/file文件。
crontab参数:
-e:编辑该用户的计时器设置;
-l:列出该用户的计时器设置;
-r:删除该用户的计时器设置;
-u<用户名称>:指定要设定计时器的用户名称。
crontab的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下: minute hour day month week command,时间字段都是整数, command:要执行的命令,可以是系统命令,也可以是自己编写的shell脚本文件。 在以上各个字段中,还可以使用以下特殊字符:
星号(*):代表所有可能的值,全部。
逗号(,):可以用逗号隔开的值指定一个列表范围。
中杠(-):可以用整数之间的中杠表示一个整数范围。
正斜线(/):可以用正斜线指定时间的间隔频率。
⑥ linux中weblogic的启动脚本nohup输出的日志如何按每日生成
在脚本nohup设置每天开始拷贝日志作为前一天的日志备份,然后把当前日志清空即可,代码如下:
crontab-e
//增加:
00***cp/dirname/logfile.log/bakdir/logfile.`date-dyesterday+%Y%m%d`.log;cat/dev/null>/dirname/logfile.log
//每周日凌晨1:00打包、删除文件:
01**0cd/bakdir;find./+mtime7-exectarcvflogfile.`date-dyesterday+%Y%U`.tar{};;find./-mtime91-execrm-f{};
⑦ shell脚本怎么生成运行日志
自己写的脚本调用的日志打印函数,供参考
在脚本开头的工作
定义日志文件LOGFILE
定义日志序列号文件_LOGSEQ
定义日志函数
log()
{
#检查是否存在日志文件,如果存在,则检查文件是否过大(20M)
#过大时,切换文件,并将目前的日志序列号保存在_LOGSEQ中。
if [ -f $LOGFILE ];then
LogFileLen=`ls -l ${LOGFILE} | awk '{print $5}'`
if [ $LogFileLen -gt 20971520 ]; then
if [ -f ${_LOGSEQ} ] ; then
_OrgSeq="`cat ${_LOGSEQ}`"
if [ $_OrgSeq -gt 98 ];then
LogFileSeq=0
else
LogFileSeq=`expr ${_OrgSeq} + 1`
fi
else
LogFileSeq=0
fi
echo "${LogFileSeq}" > ${_LOGSEQ}
mv $LOGFILE ${LOGFILE}.${LogFileSeq}
fi
fi
_LogInfo=$1
echo `date +20'%y-%m-%d %H:%M:%S'`" ${_LogInfo} " >> ${LOGFILE} 2>&1
}
需要打日志时调用log函数即可
⑧ 如何实现日志分析自动化
1.自动运行
shell脚本只需要把所有命令放到一个文本之中就可以了,windows和linux都是能够实现sh脚本的定时运行的(具体方法请自行搜索)
2.日志获取
2.1shell是可以登录ftp下载文件的,只需要将已下载的日志文件名存储到固定的文本之中,下载时比对已经存在的文件名,下载新的日志文件就行了。具体步骤就是 登陆ftp--->进入固定目录----->获取所有文件名----->对比出新文件名------>下载。
3.数据存储
把需要长期监控的数据放到csv文件中,每日一行,用excel打开或者另存为excel后可以很方便的生成图表。(当然也可以存数据库,推荐用csv,简单有效)
4.数据获取
比较简单的方法就是需要的每个数据写一条命令去获取,第一条数据直接存储(用>),后面的追加(用>>)到同一个文本文件中,然后再把每天的数据,添加到固定的csv文件末尾 (awk '{printf $0}' 可以直接把竖排数据变横排)
5.周报问题(如果和日报需要的数据不同)
单独新建一个7天和30天固定运行一次的脚本,自动分析前七天和前30天的所有日志。从2中存储的已下载日志文件名的文本中,可以提取最后7天或者30天的日志文件名,然后进行分。析(和每日的日志分析相比,就是多了提取前7天的日志文件名,然后由cat 1变成了cat 1,2,3,4,5,6,7)
以上在个人的windows系统上也是比较容易实现的,以后每天就可以很方便收集网站的运行数据了。
补充:
Csv格式举例在存储好数据之后,还可以用awk取数比对最后两天的变化比例,超过多少就执行xxxx方法,比如在桌面输出一个命名为“警告!dd号xxx数据波动”的文本文件