systemd运行motion触发脚本调用ssmtp失败:无法打开mailhub:25
解决方案
1. 检查并修改systemd单元的文件系统保护配置
systemd的ProtectSystem等选项会限制进程对系统目录的访问,这是最可能的问题根源:
- 打开motion的systemd单元编辑:
sudo systemctl edit motion.service - 在编辑器中添加以下内容,放宽对
/etc/ssmtp目录的访问限制:[Service] # 若原有ProtectSystem=strict,改为full;无此配置则直接添加 ProtectSystem=full # 允许进程访问ssmtp配置目录 ReadWritePaths=/etc/ssmtp - 重新加载systemd配置并重启motion服务:
sudo systemctl daemon-reload sudo systemctl restart motion
解释:ProtectSystem=strict会将/etc设为只读且部分路径不可见,full模式允许读取/etc下的文件,搭配ReadWritePaths可确保进程能访问ssmtp的配置文件。
2. 确保motion进程加载mail附加组
有时systemd启动进程时不会自动加载用户的附加组,导致motion无法获得mail组的权限:
- 编辑systemd单元,添加附加组配置:
sudo systemctl edit motion.service - 添加:
[Service] SupplementaryGroups=mail - 重新加载并重启服务:
sudo systemctl daemon-reload sudo systemctl restart motion - 验证进程组权限:
ps aux | grep motion | awk '{print $10}' # 查看进程的组ID id motion # 对比mail组ID是否匹配
3. 修正脚本执行环境
systemd的默认PATH比命令行更受限,需确保脚本中使用ssmtp的完整路径:
- 修改发送邮件脚本,将
ssmtp替换为完整路径(通常是/usr/sbin/ssmtp):# 原脚本示例: # echo "邮件内容" | ssmtp recipient@example.com # 修改为: echo "邮件内容" | /usr/sbin/ssmtp recipient@example.com - 也可在脚本开头显式设置PATH:
#!/bin/bash export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin # 后续ssmtp命令...
4. 验证ssmtp二进制文件权限
确保ssmtp的执行权限允许mail组用户运行:
ls -l /usr/sbin/ssmtp
正常输出应为-rwxr-x--- root mail,若权限不符,执行修正:
sudo chmod g+x /usr/sbin/ssmtp sudo chgrp mail /usr/sbin/ssmtp
内容的提问来源于stack exchange,提问作者miller the gorilla
相关产品推荐
相关产品推荐

