升级Ubuntu与Firefox后/dev/ttyACM0端口访问报错求助
排查方向与解决方案
1. 检查Web服务器进程的用户权限
命令行运行PHP时用的是当前登录用户,但web服务器(如Apache的www-data、PHP-FPM的www-data)的运行用户可能没有访问/dev/ttyACM0的权限:
- 查看web服务器运行用户:
# Apache ps aux | grep apache2 # PHP-FPM ps aux | grep php-fpm - 将该用户加入串口设备所属的
dialout或tty组:sudo usermod -aG dialout www-data sudo usermod -aG tty www-data - 重启服务生效:
sudo systemctl restart apache2 # 若用PHP-FPM则执行 sudo systemctl restart php8.2-fpm
2. 验证AppArmor限制
Ubuntu升级后AppArmor规则可能更新,限制了web服务器访问串口设备:
- 查看AppArmor状态:
sudo aa-status - 检查是否有针对Apache/PHP-FPM的profile限制了
/dev/ttyACM0:sudo grep -r ttyACM0 /etc/apparmor.d/ - 若存在限制,编辑对应profile文件(如
/etc/apparmor.d/usr.sbin.apache2),添加允许规则:/dev/ttyACM0 rw, - 重新加载AppArmor:
sudo systemctl reload apparmor
3. 确认PHP的open_basedir限制
Ubuntu升级后PHP配置可能被重置,open_basedir可能禁止访问/dev目录:
- 查看当前
open_basedir配置:php -i | grep open_basedir # 或通过web端phpinfo()输出搜索open_basedir - 若未包含
/dev,修改php.ini或站点对应的php-fpm配置:open_basedir = /var/www/html/:/dev/:/tmp/ - 重启PHP-FPM或Apache生效
4. 排除Firefox端干扰(低概率)
- 用Firefox隐私窗口(Ctrl+Shift+P)访问,排除浏览器扩展干扰
- 清空Firefox缓存与Cookie后重新测试
5. 调试上下文差异
在program.php中添加调试代码,对比命令行与web端的执行差异:
<?php echo "当前运行用户: " . get_current_user() . "\n"; echo "ttyACM0权限: " . substr(sprintf('%o', fileperms('/dev/ttyACM0')), -4) . "\n"; echo "设备所属组: " . posix_getgrgid(filegroup('/dev/ttyACM0'))['name'] . "\n"; ?>
通过Firefox访问该脚本,和命令行执行php program.php的输出对比,定位权限或上下文差异点
内容的提问来源于stack exchange,提问作者user2976382
相关产品推荐
相关产品推荐

