我有一个运行 sendmail 8.16 的 FreeBSD 机器。我有几个系统用户(测试机器人):robot1
,robot2
并且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@localhost
、robot2
当消息用于时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