cron下msmtp的passwordeval程序读取stdin失败的原因

cron下msmtp的passwordeval程序读取stdin失败的原因

我在 Ubuntu 18.04 系统上使用 msmtp 作为 sendmail 程序。我没有将 smtp 服务的密码直接保存在 msmtprc 文件中,而是编写了一个小型 ruby​​ 程序,我将其称为“authinfo”,该程序在命令行上获取主机名,在 ~/.authinfo.gpg 中找到其密码,解密后将其回显到 stdout。

如果我从命令行运行 msmtp,效果很好。

但是,当 cron 运行它来发送有关 cron 命令的电子邮件时,它会失败,日志文件中显示以下内容:

Jul 16 16:01:01 micah CRON[19482]: (ded) CMD (bash -l -c 'env >&2 && exit 2')
Jul 16 16:01:05 micah cron[1486]: Cannot read from file '/.authinfo.gpg'.
Jul 16 16:01:05 micah cron[1486]: sendmail: cannot read output of '/home/ded/bin/authinfo smtp.gmail.com'
Jul 16 16:01:05 micah CRON[19481]: (ded) MAIL (mailed 1846 bytes of output but got status 0x004e from MTA#012)

似乎它无法读取我的 authinfo 程序的标准输出。这与从 crontab 命令的第六个字段运行的命令不同,后者受 crontab 文件中的 SHELL 和 PATH 环境设置的影响。我猜 sendmail 的运行方式是硬编码到 cron 中的。不知何故,它不允许 sendmail/msmtp 从 .msmtprc 文件中获取 passowrdeval 程序的输出。

有什么想法可以解释原因吗?

答案1

以防其他人遇到这种情况,我在发布问题后就找到了问题所在。运行 sendmail(又名 msmtp)的 cron 进程未在我的用户名下运行。因此,我的 authinfo 程序默认文件名为“ENV['HOME']/.authinfo.gpg”,但环境中没有设置 HOME,因此它在 /.authinfo.gpg 中查找,但该文件并不存在。

因此出现错误。解决方案是允许我的 authinfo 程序将 authinfo 文件的完全展开路径作为命令行参数。这样做之后,它按预期运行。

相关内容