ssmtp在cron执行备份脚本时异常:发件人与收件人被替换导致邮件无法送达
ssmtp在cron执行备份脚本时异常:发件人与收件人被替换导致邮件无法送达
看起来你遇到的是cron环境与交互式shell环境差异导致的ssmtp行为不一致问题,我来帮你拆解原因和解决办法:
核心原因分析
cron运行脚本时,会使用极简的环境变量(比如PATH更短、没有用户登录时加载的环境配置),同时ssmtp的发件人/收件人逻辑会受以下因素影响:
- 默认以运行脚本的系统用户(cron默认用root的话就是
root@yourdomain)作为发件人,除非明确指定 - 如果ssmtp配置里的
FromLineOverride设为NO,会忽略你脚本里的From头,强制用系统默认发件人 - 脚本里的命令可能因为PATH问题执行失败,间接导致邮件内容或发送逻辑异常
具体解决步骤
1. 强制指定发件人到ssmtp命令
修改脚本里的ssmtp调用,添加-f参数明确指定发件人邮箱,这样不管环境如何,都会用你指定的发件人:
ssmtp -v -F "Backup report" -f your-sender-email@domain.com me@mydomain.com < /backup/$DAN/backup.log
这里的your-sender-email@domain.com替换成你手动执行时正常工作的发件人(比如你日志里的recipient@domain.com)。
2. 检查ssmtp配置文件
编辑/etc/ssmtp/ssmtp.conf,确保以下配置:
FromLineOverride=YES
这个配置允许脚本里的From头覆盖系统默认的发件人,避免cron运行时被强制替换成root@xxx。
3. 给脚本里的命令添加绝对路径
cron的PATH默认很窄,很多命令(比如tree、du、rsync)可能找不到,导致脚本执行异常。先查命令的绝对路径:
which tree && which du && which rsync && which ssmtp
然后替换脚本里的对应命令,比如:
FILES=`/usr/bin/tree -f /backup/$DAN/ | /usr/bin/wc -l` SIZE=`/usr/bin/du -sh /backup/$DAN/` /usr/bin/rsync -avh --progress -h /mnt/share/ /backup/$DAN /usr/sbin/ssmtp -v -F "Backup report" -f your-sender-email@domain.com me@mydomain.com < /backup/$DAN/backup.log
4. 给脚本设置完整的环境变量
在脚本开头添加PATH配置,确保所有命令都能被找到:
#!/bin/bash PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
5. 调试cron执行日志
修改cron任务,把脚本的输出和错误重定向到日志,方便排查问题:
0 22 * * * /path/to/your/backup-script.sh >> /var/log/backup_cron.log 2>&1
之后查看/var/log/backup_cron.log,就能看到脚本执行时的所有错误信息,比如哪个命令没执行成功。
额外脚本优化点
注意到你脚本里有个笔误:echo >> /backup/$DAN/bekap.log,这里的bekap.log应该是backup.log,会导致这部分内容没写到正确的日志文件里,建议修正。
备注:内容来源于stack exchange,提问作者Marxer
相关产品推荐
相关产品推荐

