bash - 以非 root 身份访问 GPIO (/sys/class/gpio)

标签 bash raspberry-pi chmod chown raspberry-pi2

默认情况下,/sys/class/gpio 只能作为 root 访问。所以我喜欢一个新组gpio可以使用/sys/class/gpio下的文件和目录。为此,我将以下行添加到 /etc/rc.local(我在 Debian 上):

sudo chown root:gpio /sys/class/gpio/unexport /sys/class/gpio/export
sudo chmod 220 /sys/class/gpio/unexport /sys/class/gpio/export

因此,这为所有 gpio 组成员提供了写入权限。所以他们现在可以exportunexport pin 了。

问题是在 export(例如 /sys/class/gpio/gpio17)之后他们无法读取/写入特定的 pin 文件,因为这些文件归 root:root 再次。

如何更改它们也默认创建为 root:gpio?我的意思是每次导出 pin 时我都可以手动执行此操作。但这有点不舒服。

更新

根据 larsks 的回答,我创建了丢失的规则文件。现在它部分起作用了:

-rwxrwx---  1 root gpio 4096 Jun 19 16:48 export
lrwxrwxrwx  1 root gpio    0 Jun 19 16:51 gpio17 -> ../../devices/soc/3f200000.gpio/gpio/gpio17
lrwxrwxrwx  1 root gpio    0 Jun 19 16:45 gpiochip0 -> ../../devices/soc/3f200000.gpio/gpio/gpiochip0
-rwxrwx---  1 root gpio 4096 Jun 19 16:45 unexport

但是对于 ./gpio17/ 我仍然得到 root:root:

-rw-r--r-- 1 root root 4096 Jun 19 16:52 active_low
lrwxrwxrwx 1 root root    0 Jun 19 16:52 device -> ../../../3f200000.gpio
-rw-r--r-- 1 root root 4096 Jun 19 16:52 direction
-rw-r--r-- 1 root root 4096 Jun 19 16:52 edge
drwxr-xr-x 2 root root    0 Jun 19 16:52 power
lrwxrwxrwx 1 root root    0 Jun 19 16:52 subsystem -> ../../../../../class/gpio
-rw-r--r-- 1 root root 4096 Jun 19 16:52 uevent
-rw-r--r-- 1 root root 4096 Jun 19 16:52 value

更新 2

好的,我解决了这个问题。因为我在 RaspbianInstaller 上安装了 Raspbian,所以我从未使用过 raspi-config 工具。这似乎是一个问题。因为我还缺少 /sys/device/virtual/gpio/ 文件夹。

我在这里遵循了这个指南:https://community.element14.com/products/raspberry-pi/f/forum/26425/piface-digital-2---setup-and-use#139528

然后权限是正确的(甚至对于 pin 文件夹及其文件 valuedirection,...)。

最佳答案

4.x 内核的更常见规则如下

SUBSYSTEM=="gpio*", PROGRAM="/bin/sh -c 'find -L /sys/class/gpio/ -maxdepth 2 -exec chown root:gpio {} \; -exec chmod 770 {} \; || true'"

如果路径中有符号链接(symbolic link),初始答案中的规则将无法对导出的 gpio 进行 chown

UPD 请记住,当您通过 sysfs 导出某些 GPIO 时,您应该等待 udev 规则触发并完成,然后才能获得所需的访问权限。对我有用的是在尝试访问 GPIO 文件之前睡大约 100 毫秒。

关于bash - 以非 root 身份访问 GPIO (/sys/class/gpio),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30938991/

相关文章:

linux - 更改目录中满足某些条件的文件列表的权限?

c - 如何在 C 中更改/显示权限

linux - 删除具有相似名称的文件,匹配范围

php - Laravel 存储/日志 - 哪些是正确的权限和用户/组?

bash - 如何在 Bash 中回显(打印)变量的值?

c# - .NET core 3.0 System.IO.Ports SerialPort始终在RPI上使用5-10%的CPU

java - 为 Raspberry Pi 编译 JD2XX

linux - Rtmp 流无法在 VLC 播放器上播放

linux - Bash Script_将从读取命令读取的变量插入命令

linux - 使用 Bash 脚本对时间戳/换行符之间的列求和