没办法,公司的要求,还有,一些山寨爬虫完全不够我们运维人员的感觉,
一天爬虫搞个三四十万的LOG,那我只好干了。。
人家GOOGLE,BAIDU,一天大约也就五六千吧。。
有一个小的SSH技巧,是判断SSH命令执行成功与否,是否有返回值,不用IF,而直接用||和&&。
~~~~~~~~~~~~~~~~~~~~~
$?变量会被赋值为0,反之,赋值为-1。通过判断$?变量的方式确实可以满足我们的要求,但是需要用if判断,要写脚本,比较繁琐,有没有比较方便的命令呢。哈,肯定有的噻。
shell中还提供了快捷操作符: && 和 ||
// 此时存在/tmp/xxxx文件,执行了&&后面的命令 # ls /tmp/xxxx && echo '/tmp/xxxx exits' /tmp/xxxx /tmp/xxxx exits// 此时存在/tmp/xxxx文件,不执行 || 后面的命令 # ls /tmp/xxxx || echo '/tmp/xxxx exits' /tmp/xxxx
我们对上例可以这么分析,&& 签名的命令执行成功就执行后面的命令,|| 前面的命令执行失败才执行后面的命令。
~~~~~~~~~~
#/bin/shtime_inter_minute=50000 alert_count=85000000 head_count=20 log_path="/xxx/xxx/log.log" last_time=`date "-d -${time_inter_minute} minute" '+%d/%b/%G:%H:%M:%S'`now_time=`date '+%d/%b/%G:%H:%M:%S'` now_time_str="[${now_time}" last_time_str="[${last_time}" echo "start time: " $last_time echo "end time: " $now_time echo "alert_count: " $alert_countshell_out=`awk -v a=$last_time_str -v b=$now_time_str '$4 > a && $4 < b' $log_path|awk '{print $1}'|sort |uniq -c | sort -nr|head -10` arra=($shell_out) echo ${arra[@]}for i in "${!arra[@]}"; doif [ `expr $i \% 2` -eq 0 ] ;thenif [ ${arra[$i]} -gt $alert_count ] && [ ${arra[$i+1]} != "xx.xx.xx.xx" ] ; then/sbin/iptables -vnL|grep ${arra[$i+1]} && echo ${arra[$i+1]} "have added"/sbin/iptables -vnL|grep ${arra[$i+1]} || /sbin/iptables -I INPUT -s ${arra[$i+1]} -j DROPfifi done
这个IP好过分哟