shell脚本监控日志
A. 如何用shell脚本捕获oracle异常
有个监视alert文件并发送邮件的,之前网上找的,你可以试下:
sql">#!/bin/bash
#功能:监控oracle的alert日志,如有ORA-错误则邮件发出。
#如果是第一次运行,脚本会创建mailinfo文件(该文件用于存放上次执行脚本时alert的日志的行数),存放本次alert日志的行数。
#初始化环境变量
source/home/oracle/.bash_profile
#邮件列表
mail_list='[email protected],[url=mailto:[email protected]][email protected],[email protected],[email protected]'[/url]
#根据自己库的实际情况,填写以下alert日志的路径
alert_log=/u01/oracle/diag/rdbms/orcl/orcl/trace/alert_orcl.log
#判断本脚本路径下是否存在mailinfo文件,不存在就创建,并放入本次alert日志的行数
if[!-e./mailinfo]
then
echo"建立mailinfo文件"
touch./mailinfo
current_line=`wc-l$alert_log|awk'{print$1}'`
echo$current_line>./mailinfo
#如果存在mailinfo文件,则检查上次行数到本次行数之间是否有ORA-错误
else
#读取上次检查到的行数
last_line=`cat./mailinfo`
echo"上次行数:"$last_line
#算出本次alert日志的行数
current_line=`wc-l$alert_log|awk'{print$1}'`
echo"本次行数:"$current_line
#取上次行数和本次行数之间的alert日志内容,然后把ORA错误及上下三行放到mailinfo中
sed-n"$last_line,$current_linep"$alert_log|grep-nB4-nA4'ORA-'>./mailinfo
#判断mailinfo文件的行数是否大于0,大于0则发邮件,无论是否发邮件都把本次行数放到mailinfo文件中
n=`wc-l./mailinfo|awk'{print$1}'`
if[$n-gt0]
then
echo"检测到错误,发邮件"
cat./mailinfo|mutt-s"10.68alert中出现ORA错误,请检查"$mail_list
#把本次行数放到mailinfo文件中
echo$current_line>./mailinfo
else
echo"没检测到错误,不发邮件"
echo$current_line>./mailinfo
fi
fi
B. shell脚本具体是干什么的,是在用什么的时候会用得到
Shell遵从经典UNIX哲学:把复杂的问题分解成简单的小问题,然后再把各部分功能组合起来解决复杂问题。
例如我可以用shell脚本来监控服务器整体的性能,当CPU负载超过我预设的警戒线,磁盘空间的阀值超过我预设的标准,服务器宕机,这些都可以通过shell编写脚本做到自动给我发告警邮件或者发短信通知我。简化每日繁琐的工作步骤,数据的备份,日志的搜集整理。太多太多了。..
C. 求大神帮我写一个服务器监控脚本,用shell脚本写。。
。。。。这还要结合你的服务才能采集到数据啊
D. 哪位大侠有linux下监控指定服务,如果服务丢失就把事件记录到日志文件svrmon.log再重启服务的shell脚本
加到计划任务里,1分钟1次
ps进程是否存在
存在则退出
不存在则记录日志,重启服务
思路就这样
E. 请问怎样用shell实现nginx日志2xx请求最大值和最小值监控,我刚接触脚本,不太懂,请大神解惑,谢谢
其实蛮简单的,就是从文件中取出需要的值,判断一下就可以了
你给个详细的一行数据出来,看下你到底要取哪几项数据
F. 如何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的脚本代码:
G. 如何使用shell脚本, 当U盘挂载到Linux系统上时, 自动获取U盘大小和剩余的空间
当有新的硬件设备加载到linux系统上的时候,linux系统会自动刷新一条日志信息到dmesg里面。你可以在刚插入U盘的时候,立即执行dmesg命令,然后就能看到这个条日志记录,可以看到U盘对应的盘符。
根据这个思路,你可以通过shell脚本监控这个日志,只要有磁盘设备更新,就取得它的盘符。假设这里是/dev/sdg,获取到盘符以后,再使用命令
fdisk -l /dev/sdg
就可以输出这个磁盘的容量信息以及剩余空间的大小,通过字符串查找把对应的值提取出来即可。
基本思路就是这个,不知道我说清楚了没有,希望可以帮助到你。
H. 如何查看shell脚本是否正常运行,跪求liunx大神
因为不知道你的是什么脚本,不好判断。
bash -x 检测整个脚本实际运行过程是否正确
对脚本执行加以监控,你可以通过在脚本中加入一些脚本执行状态结果的语句比如导出个日志文件啦,或者对执行结果进行判断啦,如果脚本是驻留在进程里,判断进程中是否有脚本啦,然后给你发个执行结果邮件。还是得根据实际情况写。
I. 如何用shell脚本实现读取多台主机监控日志
#!/bin/bash
top>>/home/info
free-m>>/home/${date+%F}info
ftp-i-nhost<<ok
useusernamepasswd
binary
put/home/${date+%F}info
bye
ok
exit
在这里机器上设置成定时任务,就可以定时收集信息了。