由 Systemd 运行时,无人值守升级不会使用 mailx

由 Systemd 运行时,无人值守升级不会使用 mailx

unattended-upgrades在运行 Raspbian ( Raspbian GNU/Linux 9.4 (stretch)) 的服务器上进行了设置。无人值守升级版本:0.93.1+nmu1

更新有效,但我在电子邮件报告方面遇到问题。我想用于mailx发送报告。如果我使用命令运行更新,unattended-upgrade -v -d报告将被发送,并且它使用我在/root/.mailrc.

unattended upgrades然而,当Systemd 计时器 ( ) 运行时apt-daily-upgrade.timer,它不会使用mailx.

如果sendmail存在,则用于发送邮件。在这种情况下,邮件会被发送,但发件人是root@hostname,并且邮件会被标记为垃圾邮件。

如果没有,sendmail我会在日志中看到此错误apt-daily-upgrade

Cannot start "/usr/sbin/sendmail": executable not found (adjust *sendmail* variable)

我无法理解为什么根据任务的启动方式使用不同的邮件程序。

我尝试编辑unattended-upgradesPython程序以强制它使用mailx

if os.path.exists(SENDMAIL_BINARY):
        ret = _send_mail_using_sendmail(from_email, to_email, subject, body)
    elif os.path.exists(MAIL_BINARY):
        ret = _send_mail_using_mailx(from_email, to_email, subject, body

我将变量更改SENDMAIL_BINARY为指向不存在的路径,因此它将强制使用mailx.这在unattended-upgrades手动调用时也有效,但在由 Systemd 运行时失败。 (上面关于尝试使用的错误sendmail仍然会被记录。)

即使 systemd 自动运行,我怎样才能强制unattended upgrades使用?是什么导致了所使用的邮件程序的差异?mailx

编辑:

运行无人值守升级的系统单元文件:

[Unit]
Description=Daily apt upgrade and clean activities
Documentation=man:apt(8)
ConditionACPower=true
After=apt-daily.service

[Service]
Type=oneshot
ExecStart=/usr/lib/apt/apt.systemd.daily install
KillMode=process
TimeoutStopSec=900

答案1

您的问题是常见问题解答的变体为什么在 systemd 下事情会有所不同?

的好处之一systemd是它提供了一致的执行环境。为了安全性和简单性的考虑,环境变量设置是最少的。

上的相关文档systemd执行环境详细说明设置的内容。

您提到您的配置位于root主目录中。man mailx确认它正在寻找~/.mailrc,而不是固定路径/root/.mailrc

文档systemd澄清该变量仅在使用指令$HOME时设置。User=您没有共享您的systemd服务文件,但我认为由于您以 root 身份运行该任务,因此您没有使用该User=指令。所以这可以解释你的部分问题。

$PATH运行时,环境变量似乎也可能未设置您想要的路径systemd。您可以通过将ExecStart=服务中的行替换为以下内容来确认这一点:

 ExecStart=/bin/echo "My path is $PATH"

如果mailx未列出路径,您可以使用Environment=指令显式设置。

如果这些明确的提示无法解决您的问题,请务必查看上面链接的常见问题解答以了解更多可能性。

答案2

我在 Ubuntu 18.04 上使用msmtp和来允许通过电子邮件向我发送更新信息。我想我遇到了和你一样的问题。我已配置并且可以使用命令行发送电子邮件。如果我自己从命令行运行它,也会向我发送一封电子邮件,但如果自动运行,那么我将不会收到电子邮件。查看日志我看到:bsd-mailxunattended-upgradesmsmtpmailxunattended-upgradesunattended-upgrades/var/log/msmtp/msmtp.log

<DATE> host=<MY_SMTP_HOST> tls=on auth=on user=<MY_STMP_USERNAME> from=<MY_EMAIL_ADDRESS> recipients=<MY_EMAIL_ADDRESS> smtpstatus=550 smtpmsg='550 5.2.0 Mail format error: No domain in From header [1633]' errormsg='the server did not accept the mail' exitcode=EX_UNAVAILABLE

所以设置有问题From header。深入研究一下,默认from使用的电子邮件地址似乎是,但您可以通过添加来自行定义。这为我解决了这个问题。unattended-upgradesroot/etc/apt/apt.conf.d/50unattended-upgradesUnattended-Upgrade::Sender "<EMAIL_ADDRESS>";

相关内容