为什么C语言编写的CGI脚本无法访问树莓派的ttyUSB0串口
问题根源
手动执行脚本时使用的是pi用户,该用户已加入拥有串口设备访问权限的dialout用户组,因此运行正常。通过网页访问时,CGI脚本由Web服务(如Apache、Nginx配套CGI进程)的运行用户(通常为www-data)执行,该用户默认不在dialout组内,没有串口设备的读写权限,因此抛出权限不足错误。
你可以执行ls -l /dev/ttyUSB0确认串口权限,默认输出类似如下格式,说明仅root用户和dialout组用户拥有读写权限:
crw-rw---- 1 root dialout 188, 0 6月 10 12:00 /dev/ttyUSB0
解决步骤
- 确认Web服务运行用户:以常见的Apache、Nginx为例,默认运行用户为
www-data,可执行ps aux | grep apache或ps aux | grep nginx查看输出第一列的用户信息确认。 - 将Web服务运行用户加入
dialout用户组,假设运行用户为www-data,执行命令:sudo usermod -a -G dialout www-data - 重启Web服务使权限配置生效:
Apache环境执行:
Nginx环境需要重启配套的CGI服务(如fcgiwrap),执行:sudo systemctl restart apache2sudo systemctl restart fcgiwrap - 临时验证方案:如果配置后仍报错,可先执行
sudo chmod 666 /dev/ttyUSB0临时放开串口权限,再访问网页测试,若此时运行正常即可确认是用户组配置问题,按上述步骤配置即可。注意临时权限重启后会失效,不要作为长期解决方案使用。
内容的提问来源于stack exchange,提问作者Stimm4
相关产品推荐
相关产品推荐

