树莓派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
相关产品推荐
相关产品推荐

