bash - 提取电子邮件地址 Perl 脚本
问题描述
我的mail.log
文件中有以下几行我想提取域并在txt
文件中生成输出,并REJECT
在域和REJECT
.
Dec 30 07:34:09 mx postfix/smtpd[23855]: NOQUEUE: reject: RCPT from unknown[120.33.244.87]: 450 4.7.1 Client host rejected: cannot find your hostname, [120.33.244.87]; from=<hcsales6@printingpress.xicp.net> to=`<`nishant@mydomain.com> proto=SMTP helo=<printingpress.xicp.net>
输出应该是这样的
printingpress.xicp.net REJECT
我已经尝试过这段代码,但这给了我带有 REJECT 的 IP 地址,我想提取域名
perl -ne 'print "$1\n" if /NOQUEUE:.*?\[(\d+?\.\d+?\.\d+?\.\d+?)\]/' /var/log/mail.log
这是最终的结果和工作场景,我有运行 policy-spf 和 DKIM 的 postfix 服务器,但收到了许多垃圾邮件连接,并且我的 postfix 很好地拒绝了请求。我想使用 smtpd_sender_restrictions 阻止这些垃圾邮件发送者,但是过滤被拒绝的主机非常耗时并且需要自动化。
感谢@Polar Bear 的解决方案。现在系统是这样工作的
后缀 main.cf
smtpd_sender_restrictions = check_sender_access hash:/etc/postfix/blacklist
黑名单.sh
#!/bin/bash
perl -ne 'print "$1 REJECT\n" if /NOQUEUE:\s+reject:.*?from=<\w+@(.*?)>/' /var/log/mail.log | sort | uniq >> /etc/postfix/blacklist
postmap /etc/postfix/blacklist
service postfix restart
授予文件权限
chmod 755 blacklist.sh
每天晚上为 blacklist.sh 运行 cronjob。
我尝试了相同的代码,只进行了少量修改,并且每 3 小时运行一次 cronjob 以获取 SASL 登录失败和阻塞 IP 地址。
解决方案
一个班轮
在 Windows 10 中(草莓 Perl)
perl -ne "print \"$1 REJECT\n\" if $_ =~ /NOQUEUE:\s+reject:.*?helo=<(.*)>/" /var/log/mail.log
在 Debian 8 [perl (v5.20.2)]
perl -ne 'print "$1 REJECT\n" if /NOQUEUE:\s+reject:.*?helo=<(.*)>/' /var/log/mail.log
OP 通知域应取自字段,每个域有一条记录,然后应按以下形式更改命令
perl -ne 'print "$1 REJECT\n" if /NOQUEUE:\s+reject:.*?from=<\w+@(.*?)>/' /var/log/mail.log | sort | uniq
或扩展代码版本
use strict;
use warnings;
use Data::Dumper;
my $debug = 1;
my %hash;
my $pattern = qr/(\w+\s+\d+)\s+([\d:]+).*?:\s+NOQUEUE:\s+(\w+):.*?\[([\d.]+)\]:\s+(\d+).*?:\s+(.*?),.*?from=<(.*?)>\s+to=<(.*?)>.*?helo=<(.*)>/;
my @fields = qw/date time state ip code err_msg from to fqdn/;
my $line = <DATA>;
chomp($line);
@hash{@fields} = ($line =~ /$pattern/);
print $hash{fqdn}. ' '. uc $hash{state} . "\n";
print Dumper(\%hash) if $debug;
__DATA__
Dec 30 07:34:09 mx postfix/smtpd[23855]: NOQUEUE: reject: RCPT from unknown[120.33.244.87]: 450 4.7.1 Client host rejected: cannot find your hostname, [120.33.244.87]; from=<hcsales6@printingpress.xicp.net> to=<nishant@mydomain.com> proto=SMTP helo=<printingpress.xicp.net>
输出
printingpress.xicp.net REJECT
$VAR1 = {
'state' => 'reject',
'from' => 'hcsales6@printingpress.xicp.net',
'time' => '07:34:09',
'code' => '450',
'ip' => '120.33.244.87',
'to' => 'nishant@mydomain.com',
'date' => 'Dec 30',
'err_msg' => 'cannot find your hostname',
'fqdn' => 'printingpress.xicp.net'
};
推荐阅读
- android - FLutter FirebaseAuth 电子邮件验证
- python - 为python unittest设置全局变量时如何避免lint错误
- python - 我的 django 项目存在属性问题。我正在用这个代码做一个电子商务网站
- python - 如何使用非有序值制作第二个 python x 轴?
- corda - Corda - 记录事务中的特定状态
- c++ - 如何将字符串路径从'\'转换为'/'或'\\'?
- assembly - 如何在 ARM64 中初始化一个 16 位整数数组?
- objective-c - 强制 FileManager().copyItem(_:_) 超时
- python - 以编程方式选择不等式运算符
- oracle - 将多个选择语句插入表时看到错误