You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 22:32:29