sendmail 重写规则放在单独的文件中

sendmail 重写规则放在单独的文件中

有没有办法将重写规则移出 sendmail.cf 文件?一方面,sendmail 文档建议仅在 sendmail.mc 文件中进行更改,但所有重写规则都在 .cf 文件中。我认为在下一次从 .mc 生成 .cf 文件时,对 .cf 文件中重写规则的所有更改都将丢失。

答案1

大多数情况下,sendmail.cf 和重写规则都被认为是非常复杂和晦涩难懂的,很少有人会去摆弄它们;整个 sendmail.mc/M4 机制为 sendmail 配置提供了更“用户友好”的前端。大多数人应该只坚持使用 sendmail.mc/M4 机制,而绝不会直接修改 sendmail.cf - 包括生成修改后的重写规则。

如果 sendmail.mc/M4 机制不太适合您,并且您想要“调整” sendmail.cf 中的几条规则,那么您可以使用 sendmail.mc/M4 机制的 LOCAL_NET_CONFIG 和 LOCAL_RULESETS 功能来实现。如果您想直接对 sendmail.cf 进行重大修改,甚至可能完全放弃 sendmail.mc/M4 机制,那么您所做的工作超出了 99.44% 的管理员需要做的事情,并且可能需要对 Makefile 和/或 shell 脚本进行一些自定义编辑来实现您想要的方案。(请注意,在某些系统上service sendmail start会调用执行 sendmail.mc/M4 机制的 Makefile,因此覆盖 sendmail.cf 的频率会比您预期的要高。)

(说实话,我有时也觉得这种两级间接前端界面有点尴尬和令人沮丧:有时我知道我想要什么,我知道如何让 sendmail.cf 做到这一点……但我无法找出使用 sendmail.mc/M4 机制的“正确”表达方式。而针对不同版本的 BIND 的建议有时误导性大于帮助性。对我来说,通常有效的方法是在 grep 命令中使用所需 sendmail.cf 中的几个词来显示“正确的”sendmail.mc/M4 功能:grep "desired_sendmail.cf_words" /usr/share/sendmail.cf/*/*。)

根据 sendmail README(可能是 /usr/share/sendmail-cf/README),您可以通过在 sendmail.mc 中指定 LOCAL_NET_CONFIG 和/或 LOCAL_RULESET(以及 LOCAL_RULE_3、LOCAL_RULE_0、LOCAL_RULE_1 和 LOCAL_RULE_2),使 M4 sendmail.mc->sendmail.cf 机制按字面意思插入任意附加重写规则。例如,要插入传递重写规则:

LOCAL_NET_CONFIG
# Add/insert my own additional rewrite-rule(s)
R$* < @ $* .$m. > $*    $#smtp $@ $2.$m. $: $1 < @ $2.$m. > $3

或者添加新的重写规则集:

LOCAL_RULESETS
# Add one or more new rewrite-rulesets (subroutines) [new name]
SLocal_trust_auth
R$*     $: $&{auth_authen}
Rsmmsp  $# OK

或者将更多重写规则附加到现有重写规则集的末尾:

LOCAL_RULESETS
# Append to one or more existing rewrite-rulesets (subroutines) [existing name]
SParse1
R$*     $: $&{auth_authen}
Rsmmsp  $# OK

然而,此机制是为了“调整”现有的重写规则框架,但不是用于对重写规则进行完全任意的更改。使用 LOCAL_NET_CONFIG 的规则将始终插入到同一位置:规则集 0 的中间位置。并且它们不能与之前的规则有太大不同,以至于交付不再大致符合现有“解析”功能所做的假设。来自 LOCAL_RULESETS 的新规则集(子例程)将仅由您插入的规则调用,或者由 sendmail 程序本身直接调用,具体取决于特定(可能模糊)的子例程名称和 sendmail.mc FEATURE 规范。并且来自 LOCAL_RULESET 的现有规则集(子例程)的扩展可以添加新功能,但可能无法更改现有功能,因为现有早期规则的匹配和“返回”将在达到您的附加规则之前终止该规则集的执行。尽管如此,这可能足以满足您的需求。

如果您这样做,请使用sendmail -bt -Ctrial_sendmail.cf_file -d21.15测试机制来确保其行为符合您的预期。请记住,您的“风格”应该是编写新规则,使其无缝融入现有规则集框架(而不是随意更改而很少考虑现有框架);这就像在由其他人构建的现有代码中添加新功能一样。分布式重写规则不仅擅长处理主线行为,还擅长处理边缘情况(单个主机的 MX?伪装异常?UUCP 连接?别名?等等);希望您添加的规则同样全面。

答案2

sendmail 在运行时读取 sendmail.cf。因此 sendmail.cf 必须存在,并且包含需要设置的完整规则和变量集,以满足工作设置的要求。构建 sendmail.cf 的最常见方法是维护更简单的 sendmail.mc 文件,然后使用米4将 sendmail.mc “编译” 成 sendmail.cf。所以,是的,可以将 sendmail.mc 文件拆分成多个部分,然后小心地执行 m4 来生成(单个)sendmail.cf

我强烈推荐蝙蝠书如果您想修改 sendmail.mc 和 .cf。有关绕过 m4 和 sendmail.mc 的方法,您可以查看Sendmail理论与实践但对于大多数人来说,这可能有点过度了。

相关内容