2

这个问题出现在 pop-before-smtp / Postfix / Dovecot 的上下文中,但是如果我知道 Perl 字符串解析,我可以自己想出一个答案。但是,我很迷茫,我什至不知道确切的问题。以机智:

我们已经使用 Postfix 很长时间了,并且有点迷上了它。现在我们需要“进入现代时代”,让人们从我们的 SMTP 服务器发送电子邮件,即使他们在我们的网络之外。因此,在完成这项工作的任务中,我找到了 pop-before-smtp。

你可以在这里找到它。

所以,我已经配置好了,但测试失败了。我使用此处的说明对其进行了故障排除,并确定尝试解析日志的 Perl 似乎不正确。我们使用 Dovecot 作为我们的 IMAP / POP 服务器,并且在配置文件中给出了三个选项。这是配置文件的摘录,显示了三个集合:

# For Dovecot POP3/IMAP when using syslog.
#$pat = '^[LOGTIME] \S+ (?:dovecot: )?(?:imap|pop3)-login: ' .
#    'Login: .*? (?:\[|rip=)[:f]*(\d+\.\d+\.\d+\.\d+)[],]';
#$out_pat = '^[LOGTIME] \S+ (?:dovecot: )?(?:imap|pop3)-login: ' .
#    'Disconnected.*? (?:\[|rip=)[:f]*(\d+\.\d+\.\d+\.\d+)[],]';

# For Dovecot POP3/IMAP when it does its own logging.
##$logtime_pat = '(\d\d\d\d-\d+-\d+ \d+:\d+:\d+)';
#$pat = '^dovecot: [LOGTIME] Info: (?:imap|pop3)-login: ' .
#    'Login: .+? rip=[:f]*(\d+\.\d+\.\d+\.\d+),';
#$out_pat = '^dovecot: [LOGTIME] Info: (?:imap|pop3)-login: ' .
#    'Disconnected.*? rip=[:f]*(\d+\.\d+\.\d+\.\d+),';

# For older Dovecot POP3/IMAP when it does its own logging.
#$pat = '^(?:imap|pop3)-login: [LOGTIME] Info: ' .
#    'Login: \S+ \[[:f]*(\d+\.\d+\.\d+\.\d+)\]';
#$out_pat = '^(?:imap|pop3)-login: [LOGTIME] Info: ' .
#    'Disconnected.*? \[[:f]*(\d+\.\d+\.\d+\.\d+)\]';

应该取消注释适用的那些,但是,它们都不起作用。

我推测“pat”是登录模式,out-pat 是注销或以其他方式断开连接的模式。

实际的日志记录格式明显不同于这三种中的任何一种,但它们很接近。以下是一对示例:

Mar 11 17:53:55 imap-login: Info: Login: user=<username>, method=PLAIN, rip=208.54.4.205, lip=192.168.1.1, TLS

Mar 11 17:59:10 IMAP(username): Info: Disconnected: Logged out bytes=352/43743

使用 POP 时,'imap-login' 被 'pop-login' 替换,而在注销时,'POP' 替换 'IMAP' - 为什么我不能说大小写的变化!

重要数据是:时间戳、用户名以及登录时的“远程”ip(“rip”)。

如果有足够的时间,我也许能够拼凑出一些可行的东西,但由于我实际上并不了解 Perl,所以这有点困难。请帮助我编写新规则来解析与我们的 Dovecot 包一起使用的日志记录输出。

4

1 回答 1

1

Perl 正则表达式的(:?..部分要求聚类但不捕获;这允许将整个组作为组进行匹配或忽略,而不会影响捕获组的编号;所有的行都只捕获一个字段,即允许的 IP。(这有点奇怪,我可能已经预料到用户名和 IP,但从长远来看,这可能会更容易。)

# For Dovecot POP3/IMAP when using syslog.
$pat = '^[LOGTIME] \S+ (?:imap|pop3)-login: Info: ' .
    'Login: .*? (?:\[|rip=)[:f]*(\d+\.\d+\.\d+\.\d+)[],]';
# not necessary? see comment header START OF PATTERNS
# $out_pat = '^[LOGTIME] \S+ (?:IMAP|POP3)\(\S+\): Info: ' .
#    'Disconnected.*';

我已经删除了这些dovecot片段,因为它们不在您的输入中。我在Info:两行都添加了。我已经修改了$out_pat使用IMAP(username),而不是原来的不再存在imap-login。(\S+如果用户名有空格,使用将中断。由于这个假设是在文件的其他地方做出的,我希望它没问题。)

由于不再需要为注销行捕获任何 IP 地址,因此最好不要定义$out_pat-START OF PATTERNS注释块包括短语如果您选择的条目还提供$out_pat,您也应该取消注释该变量,这允许我们跟踪仍然连接到服务器的用户(例如,Thunderbird 缓存打开的 IMAP 连接)。

我没有对此进行测试,但我对此感觉良好。

于 2012-03-12T02:37:52.920 回答