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)的权限:- 给
runyaml.sh添加执行权限:chmod +x /path/to/runyaml.sh - 切换到
www-data用户手动执行脚本,验证是否能正常发送:sudo -u www-data /path/to/runyaml.sh user@example.com "Test Subject" "Test Body" - 确保
www-data用户能访问Ansible命令和Playbook文件。
- 给
内容的提问来源于stack exchange,提问作者gigapico00
相关产品推荐
相关产品推荐

