在这种情况下,我写了一个小脚本来生成拒绝电子邮件的IP地址列表:
msgid_array=($(grep ' sendmail\[' /var/log/maillog |
egrep -v 'stat=(Sent|queued|Please try again later)' |
egrep dsn='5\.[0-9]\.[0-9]' | awk '{print $6}'))
for z in ${msgid_array[@]}; do
ip_array[x++]=$(grep $z /var/log/maillog | egrep -m 1 -o 'relay=.*' |
egrep -o '([[:digit:]]{1,3}\.){3}[[:digit:]]{1,3}')
done
所以它做的是查找被拒绝的电子邮件的所有消息ID并将它们存储在msgid_array中。
然后使用for循环,grep是带有每个消息ID的maillog,并过滤掉发件人的IP地址,并将所有IP存储在ip_array中。
现在我打算每天运行它并让它解析昨天的日志条目,然后将结果存储在一个单独的txt文件中。
如果我的txt文件中有“rejected_ip_addresses =”条目,我怎么能简单地将任何新IP地址添加到现有列表中?
所以今天我运行它,条目看起来像这样:
rejected_ip_adresses=1.1.1.1 2.2.2.2
明天当我运行它时,阵列看起来像这样,因为同样的2个发送者在发送电子邮件方面遇到了问题,但有2个新发送者:
ip_array=(1.1.1.1 2.2.2.2 3.3.3.3 4.4.4.4)
所以我在txt中的输入现在应该是这样的,关键是每月都会对所有有问题的地址进行概述:
rejected_ip_adresses=1.1.1.1 2.2.2.2 3.3.3.3 4.4.4.4
感谢任何想法,目前我的大脑拒绝帮助我。
答案 0 :(得分:1)
我会将条目(每行一个)附加到文件中并执行sort -u
:
printf "%s\n" ${ip_array[@]} >> problem_ips.txt
sort problem_ips.txt > tmp.txt && mv tmp.txt problem_ips.txt
您可以通过以下方式替换循环来大大加快速度:
ip_array=($(printf "%s\n" ${msgid_array[@]} | grep -f - /var/log/maillog ... ))
通过一次调用grep
来执行相同的操作,可以将多次调用替换为awk
,从而略微提高速度。然而,最大的收获将是删除所有那些greps被多次调用的循环。
答案 1 :(得分:0)
可能你可以拥有名称和值对(我的意思是变量),你可以将它们输入到你的脚本中。退出脚本之前,您可以再次重新创建名称和值对。
Example:
Variables.conf
rejected_ip_adresses=1.1.1.1 2.2.2.2 3.3.3.3 4.4.4.4
from_email=test@test.com
to_email=test@test.com
parse.sh
source variable.conf
.
.
.
<parsing logic>
.
.
.
.
<loop to store the variables back>