树莓派运行GPIO配置bash脚本时sudo与权限异常问题咨询
树莓派Buster系统GPIO配置脚本权限异常原因分析
前置核心规则
- sysfs GPIO权限规则:向
/sys/class/gpio/export写入GPIO编号后,内核会动态生成对应/sys/class/gpio/gpio<编号>目录,该目录下文件默认初始归属为root:root,仅root可写。树莓派系统的udev规则会异步将该目录的归属修改为root:gpio,并开放组读写权限,pi用户默认属于gpio组,该权限修改过程存在毫秒级的时间窗口。 - Shell重定向权限规则:
command > file的重定向操作由当前运行命令的Shell进程处理,优先级高于命令本身的执行。因此即使命令前加了sudo,重定向的权限依然继承当前普通用户的权限,不会跟随sudo提升为root权限。
各场景异常原因拆解
- 场景1(pi用户直接运行原始脚本报错):脚本连续执行两行命令,第二行刚完成GPIO27的export操作,立刻执行第三行写入direction文件,此时正好处于udev还未完成权限修改的时间窗口,初始状态下pi用户无写入权限,因此触发Permission denied报错。
- 场景2(pi用户单独执行第三行命令正常):单独执行第三行前,已经通过之前的脚本运行或手动操作完成了GPIO27的export,udev早已完成权限修改,pi用户属于gpio组有写入权限,因此运行正常。
- 场景3(脚本第三行加sudo后运行仍然报错):sudo仅给
echo命令赋予了root权限,但写入direction文件的重定向操作依然由运行脚本的普通pi用户Shell处理,此时仍处于udev未完成权限修改的时间窗口,pi用户无写入权限,因此仍然报错。如果需要用sudo实现单条命令提权写入,正确写法为echo "out" | sudo tee /sys/class/gpio/gpio27/direction。 - 场景4(sudo运行整个脚本正常):整个脚本的执行身份为root,root对sysfs所有文件默认拥有读写权限,不受udev权限修改的时间窗口影响,因此运行正常。
内容的提问来源于stack exchange,提问作者jivaro
相关产品推荐
相关产品推荐

