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

树莓派LAMP环境下PHP调用含GPIO库的Python脚本无输出问题

树莓派LAMP环境下PHP调用GPIO脚本的权限问题及安全解决方案

问题背景

在树莓派4搭建的LAMP环境中,尝试通过PHP执行Python脚本读取GPIO输入并写入SQL数据库。使用gpiozero库读取GPIO时,PHP调用含该库的Python脚本无输出;但脚本本身在终端可正常运行,仅输出文本的Python脚本也能被PHP正常调用。

代码示例

PHP代码

<?php
    // 读取树莓派GPIO状态
    $command = escapeshellcmd('/bin/python /var/www/html/check.py');
    echo $output = shell_exec($command);
?>

Python脚本(check.py)

from gpiozero import Button 

button = Button(4)

if button.is_pressed:
    print("Pressed")
print("Hello World")

调试过程

  • 尝试使用gpio all命令时提示bash: gpio: command not found,重装wiringpi未解决问题
  • 换用RPi GPIO库后仍出现相同无输出问题,确认核心原因是权限不足
  • 调试阶段:VSCode中脚本可正常输出全部内容,但浏览器访问PHP页面仅显示无GPIO操作的输出部分

临时方案及隐患

通过visudo给www-data用户添加无密码sudo权限,修改PHP命令加入sudo后问题解决,但该方案存在严重安全风险:恶意攻击者可通过PHP执行任意sudo命令,导致系统被完全控制。

安全权限配置方案

1. 将www-data加入gpio用户组

树莓派的GPIO设备默认归gpio用户组所有,将web服务器用户加入该组即可获得合法的GPIO访问权限:

sudo usermod -a -G gpio www-data

执行后重启Apache服务使权限生效:

sudo systemctl restart apache2

2. 验证权限配置

创建测试脚本验证权限是否生效:

# test_gpio_perm.py
from gpiozero import Button
button = Button(4)
print("GPIO access granted" if button else "GPIO access denied")

使用www-data用户执行该脚本:

sudo -u www-data python /var/www/html/test_gpio_perm.py

若输出GPIO access granted,说明权限配置成功,此时PHP无需添加sudo即可正常调用GPIO脚本。

3. 额外安全加固措施

  • 锁定Python脚本权限:仅允许所有者和www-data修改,其他用户只读
    sudo chown www-data:www-data /var/www/html/check.py
    sudo chmod 750 /var/www/html/check.py
    
  • 严格过滤PHP中的用户输入,禁止直接将用户输入作为命令参数传递给exec()/shell_exec(),防止命令注入攻击
  • 最小化GPIO脚本的功能范围,仅保留必要的GPIO读取逻辑,避免包含敏感操作

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 11:30:45