首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实时监控,无法阻止IP。

实时监控,无法阻止IP。
EN

Stack Overflow用户
提问于 2020-03-28 18:30:16
回答 1查看 49关注 0票数 0

我想阻止IP地址从一个日志文件,IP是从access.log文件收集在apache2中。is被正确地收集在文件ips.log中,但是在读取文件以禁止收集的is时,块没有完成。

代码语言:javascript
复制
 #!/bin/bash

 # Store words to avoid an search for
 BADWORDS=( '/etc/passwd' 'file?' 'w00tw00t' 'fckeditor' 'ifconfig' )
 # Get number of elements in the backup_files array
 entries=${#BADWORDS[@]}

 for ((i=0; i<= entries-1; i++))
 do
 setBadWord=${BADWORDS[$i]}

 tail -F /var/log/apache2/access.log | grep --line-buffered "$setBadWord" | while read -r a; do echo "$a" | awk '{ print $1 } ' >> ips.log; done

 done # end for


while IFS= read -r ip; do
iptables -A INPUT -s "$ip" -j DROP
done < ips.log
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-28 22:49:22

您的代码有许多问题:

它为所选的每一行运行一个新的awk副本(根本不需要awk);

  • 它尝试多次运行第一个循环(因为tail -F,第一个循环的每个元素都没有完成),因此iptables循环从来不启动

H 112 iptables命令附加一个新规则,即使在H 214<>H 115>之前看到了它,编写i<entriesi<=entries-1更简单,而且使用for setBadword in "${BADWORDS[@]}"; do ...更简单。

如果您真的想永久循环读取日志文件,则可以使用GNU实用程序执行如下操作:

代码语言:javascript
复制
#!/bin/sh

log=/var/log/apache2/access.log
words=/my/list/of/badwords/one/per/line
banned=/my/list/of/already/banned/ips

tail -F "$log" |\
grep --line-buffered -Ff "$words" |\
while read ip junk; do
    grep -qxF $ip "$banned" || (
        iptables -A INPUT -s $ip -j DROP
        echo $ip >> "$banned"
    )
done

# we never get here because "tail -F" never finishes

要只处理日志文件一次,然后完成,您可以直接从"$log"中输入"$log"

代码语言:javascript
复制
grep --line-buffered -Ff "$words" "$log" | ...

但是,仅仅使用明确针对这类任务设计的fail2ban可能就不那么容易出错了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60905172

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档