grep /var/log/maillog 向某个用户发送电子邮件,仅基于他的 Linux 用户名

grep /var/log/maillog 向某个用户发送电子邮件,仅基于他的 Linux 用户名

我有一个基于 Linux CentOS 的学习环境,运行着 Postfix 和 SquirrelMail,但我的任务更笼统。

我需要在邮件日志中查找电子邮件收到者某个用户在某个时间范围内,基于仅有的在他的 Linux 用户名上。

我看到了我的邮件日志,但我没有阅读邮件日志的经验,我有两个问题:

  1. 我在日志中看到的这些模式是否可靠,即传入电子邮件的日志是否始终包含to=<EMAIL>在其中。

    Jan 2 20:31:17 tmcent01 postfix/local[27450]: B58C4330038: to=<[email protected]>, orig_to=<postmaster>, relay=local, delay=9.7, delays=9.6/0.03/0/0.02, dsn=2.0.0, status=sent (delivered to mailbox)
    
  2. Linux 用户名如何与用户的电子邮件名相对应?它并不总是匹配(用户名@域),是吗?我们可以为它指定别名,在为 编写正则表达式时如何考虑这一点grep

我的前两次尝试均被三振出局。

sudo grep "to=<jsmith@" /var/log/maillog | grep 1[2-4]:[0-5][0-9]:[0-5][0-9]
sudo grep -w "jsmith" /var/log/maillog | grep 1[2-4]:[0-5][0-9]:[0-5][0-9]

答案1

这是一个简单的示例脚本供您尝试。它将从公共 /etc/aliases 文件中搜索用户的别名。

#!/bin/bash

# Arguments: 
# $1 = user name to be searched for
# $2 = location for e-mail log file

# First, let's create a temporary working directory.
WORKDIR=$(mktemp -d)
cd "${WORKDIR}" || exit

# Create a file for user's user name and all aliases.
echo "to=<""$1" > search_key.txt

# Then, let's find out possible alises for the user.
# Awk is used just to separate the first column.
grep "$1" /etc/aliases | awk 'BEGIN { FS=":" }; {print "to=<" $1}' >> search_key.txt

# Next, search for e-mails sent for all these.
grep -f search_key.txt "$2"

# Finally, remove the working directory.
rm -rf "${WORKDIR}"

# All done.

答案2

我在日志中看到的这些模式是否可靠,即传入电子邮件的日志是否始终必须包含在其中

是的,Postfix 处理的任何电子邮件都会有一个带有 to=... 的条目,但这将包括未在本地发送的电子邮件。另外,请注意,电子邮件地址中的邮箱部分不一定与单个本地用户相同 - Postfix 可能对此应用扩展/替换,并且 MDA 可能对其应用扩展/替换。

捕获您想要的信息的唯一可靠机制是检测 MDA,而不是 MTA。

相关内容