本人不才,shell菜鸟,服务器被人攻击,于是自写 shell 以防攻击,shell 脚本内容如下,现在有一问题就是有时候会写入空内容到目的文件中,请大神帮忙诊断一下,谢谢。
#!/bin/bash
#从nginx访问日志中筛选ip超过 800 的记录,将其ip加入到nginx的ip黑名单中去
#从nginx错误日志中筛选ip超过 100 的记录,将其ip加入到nginx的ip黑名单中去
#nginx 访问日志文件路径
nginxAccessLogFile=/home/www/nginx_access.log
#nginx 错误日志文件路径
nginxErrorLogFile=/home/www/nginx_error.log
#nginx ip黑名单文件路径
nginxBlackIpFile=/home/www/nginx_ip_black.conf
#请求超过多少次就加入黑名单
accessMinCount=800
#错误超过多少次就加入黑名单
errorMinCount=100
var1=$(cat $nginxAccessLogFile|awk '{print $1}'|sort|uniq -c|sort -n|awk '{if($1>3000) print "deny "$2";"}')
var2=$(cat $nginxErrorLogFile|grep "client.*, server"|awk -v FS=',' '{print $2}'|awk -v FS=' ' '{print $2}'|sort|uniq -c|sort -n|awk '{if($1>300) print "deny "$2";"}')
var3=""
if [ ! -z "$var1" ]; then
var3=$var1
fi
if [ ! -z "$var2" ]; then
if [ ! -z "$var3" ]; then
var3="${var3}\n${var2}"
else
var3=$var2
fi
fi
if [ ! -z "$var3" ]; then
echo -e "${var3}" > $nginxBlackIpFile
sort $nginxBlackIpFile | uniq > $nginxBlackIpFile
#重载nginx服务
service nginx reload
fi
我的想法是当 var3 变量内容为空的时候就不要往nginx黑名单文件中写内容了,但是实际经常写入空内容,我手动运行一次脚本又写入了不为空的内容,甚是奇怪。
sort $nginxBlackIpFile | uniq > $nginxBlackIpFile
这里同时读写同一个文件是有问题的。重定向会在命令一开始执行就把文件清空了。这个时候重定向可以用
sponge
替换一下:sort $nginxBlackIpFile | uniq | sponge $nginxBlackIpFile
sponge 命令会读完 stdin 的全部内容之后再去写文件。安装的话,一般在一个叫 moreutils 的包里。