请问我这个shell为啥有时候会写入空白内容到文件呢?

本人不才,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黑名单文件中写内容了,但是实际经常写入空内容,我手动运行一次脚本又写入了不为空的内容,甚是奇怪。

阅读 1.6k
1 个回答

sort $nginxBlackIpFile | uniq > $nginxBlackIpFile

这里同时读写同一个文件是有问题的。重定向会在命令一开始执行就把文件清空了。这个时候重定向可以用 sponge 替换一下:

sort $nginxBlackIpFile | uniq | sponge $nginxBlackIpFile

sponge 命令会读完 stdin 的全部内容之后再去写文件。安装的话,一般在一个叫 moreutils 的包里。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题