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

PHP通过shell_exec传参至bash脚本调用Ansible发邮件失败

问题排查与修复方案

1. 修正PHP脚本的参数传递逻辑

PHP调用shell_exec时,必须对参数做转义处理,避免空格、特殊字符破坏命令结构:

$to = escapeshellarg('user@example.com');
$subject = escapeshellarg('Test Subject');
$body = escapeshellarg('Hello, this is test content');
// 执行脚本并捕获输出用于调试
$output = shell_exec("/path/to/runyaml.sh $to $subject $body");
echo $output;

核心是用escapeshellarg()包裹所有参数,确保每个参数被当作独立整体传递。

2. 修复bash脚本的参数接收与传递

确保runyaml.sh正确捕获参数,并以Ansible可识别的格式传递:

#!/bin/bash
# 校验参数数量
if [ $# -ne 3 ]; then
    echo "Usage: $0 <recipient> <subject> <body>"
    exit 1
fi
# 用引号包裹参数,防止含空格的参数被拆分
TO="$1"
SUBJECT="$2"
BODY="$3"
# 通过-e参数传递额外变量给Playbook
ansible-playbook /path/to/mailSender.yml -e "recipient=$TO email_subject=$SUBJECT email_body=$BODY"

注意:变量名要和后续Playbook中使用的名称完全对应。

3. 确保Ansible Playbook正确接收变量

修改mailSender.yml,替换硬编码值为传入的变量:

---
- name: Send email via Ansible
  hosts: localhost
  tasks:
    - name: Send mail
      ansible.builtin.mail:
        to: "{{ recipient }}"
        subject: "{{ email_subject }}"
        body: "{{ email_body }}"
        from: "sender@yourdomain.com"
        smtp_server: "smtp.yourdomain.com"
        # 根据SMTP服务器需求添加其他配置(如端口、认证信息)

这里的变量名recipient、email_subject、email_body必须和bash脚本传递的完全一致。

4. 调试与权限排查

  • 在bash脚本中添加日志输出,验证参数是否正确接收:
    echo "Received params: TO=$TO, SUBJECT=$SUBJECT, BODY=$BODY" >> /tmp/ansible_mail_debug.log
    
  • 检查PHP运行用户(通常是www-data)的权限:
    1. 给runyaml.sh添加执行权限:chmod +x /path/to/runyaml.sh
    2. 切换到www-data用户手动执行脚本,验证是否能正常发送:
      sudo -u www-data /path/to/runyaml.sh user@example.com "Test Subject" "Test Body"
      
    3. 确保www-data用户能访问Ansible命令和Playbook文件。

内容的提问来源于stack exchange,提问作者gigapico00

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 08:55:17