如何使通过 sendmail 别名文件配置的脚本以该电子邮件的收件人用户身份运行?

如何使通过 sendmail 别名文件配置的脚本以该电子邮件的收件人用户身份运行?

我有一个运行 sendmail 8.16 的 FreeBSD 机器。我有几个系统用户(测试机器人):robot1robot2并且robot3我希望他们由电子邮件控制。首先他们应该能够收到电子邮件。所以我有以下几行/etc/mail/aliases

robot1: "| /usr/local/project/script"
robot2: "| /usr/local/project/script"
robot3: "| /usr/local/project/script"

这些机器人应该以完全相同的方式处理邮件,因此它们都使用相同的脚本。

问题是:sendmail 总是使用伪造的 uid 26(即“mailnull”特殊用户)为所有三个收件人调用该脚本。看起来 sendmail 守护进程在启动外部脚本之前会降级其在 fork 上的有效 gid/uid。这是完全合理的,但是:

问题是:如何让 sendmail 以相应的收件人用户身份运行脚本,即robot1当消息用于时robot1@localhostrobot2当消息用于时robot2@localhost以及robot3当消息用于时robot3@localhost

显而易见的解决方案是拥有脚本的三个副本,使每个副本都有其各自的用户,并为每个机器人用户为其脚本副本添加别名。我想这应该可以解决问题,但是有点丑陋。所以我想知道是否有更好、更优雅的解决方案?

答案1

我会简单地使用sudo.

在默认安装中,sendmail 以 user 身份执行别名脚本mailnull。可以允许mailnull使用sudo冒充只有那些用户,并这样做仅用于运行该特定脚本的目的

首先,成为root,然后运行visudo并编辑:

mailnull ALL = (robot1) NOPASSWD: /usr/local/project/script
mailnull ALL = (robot2) NOPASSWD: /usr/local/project/script
mailnull ALL = (robot3) NOPASSWD: /usr/local/project/script

现在将您的内容编辑/etc/mail/aliases为:

robot1: "|sudo -u robot1 /usr/local/project/script"
robot2: "|sudo -u robot2 /usr/local/project/script"
robot3: "|sudo -u robot3 /usr/local/project/script"

并做

cd /etc/mail
make

相关内容