用户在gpio group raspberry pi上运行时,gpio脚本返回权限被拒绝

时间:2017-10-02 23:15:46

标签: bash shell raspberry-pi raspbian gpio

在raspberry pi 1上,raspbian stretch lite 9.1版 - 内核版本4.9.52 +

我制作了一个shell程序,通过raspberry pi的gpio点亮了一个led(文件名是led.sh)。我需要与某些文件交互的部分:

function makeOn {
  # status has value 1 if led is on and 0 if led is off
  if [ $(status) -eq 1 ]; then
    echo "led is already on"
  else
    #say we are using pin 18 and set it to output mode
    echo "18" > /sys/class/gpio/export
    echo "out" > /sys/class/gpio/gpio18/direction # this is line 38

    # write output
    echo "1" > /sys/class/gpio/gpio18/value # this is line 41
    echo "led is on"
  fi
}

我是以gpio组中的用户身份运行的。这些是我试图在我的程序中弄乱的文件:

enter image description here

enter image description here

当我运行led.sh时会发生这种情况:

enter image description here

奇怪的是,我一个接一个地在shell上运行这些命令,没问题。但是当我运行一个调用它们的脚本时,即使我在gpio组中,我也会被拒绝。首先,我认为shell可以作为特殊用户运行命令,并通过在几个位置向led.sh添加echo $ EUID进行检查,并且它们都返回了我的用户ID。

为什么此程序对这些文件的权限被拒绝,如何授予/修复此权限?

3 个答案:

答案 0 :(得分:0)

所以我做了一些实验,这就是我得到的:

起初我考虑过像chmod 777这样的问题文件只是为了测试,然后我记得那不会起作用,因为这些文件是在echo "18" > /sys/class/gpio/export导出引脚时创建的。 / p>

所以我认为这可能是问题,并在其后添加sleep 0.1,以便系统有时间"正确创建和设置文件的权限"。它现在有效。

答案 1 :(得分:0)

如何在sleep之后立即添加gpio/export

echo "18" > /sys/class/gpio/export
sleep 0.1

这似乎是一个时间问题。

答案 2 :(得分:-1)

对于 Ubuntu 运行。

sudo apt install rpi.gpio-common.

但如果对于 Raspberry OS,该软件包不可用,则安装文件的内容是。

$ cat /lib/udev/rules.d/60-rpi.gpio-common.rules 
SUBSYSTEM=="bcm2835-gpiomem", KERNEL=="gpiomem", GROUP="dialout", MODE="0660"
SUBSYSTEM=="gpio", KERNEL=="gpiochip*", ACTION=="add", PROGRAM="/bin/sh -c 'chown root:dialout /sys/class/gpio/export /sys/class/gpio/unexport ; chmod 220 /sys/class/gpio/export /sys/class/gpio/unexport'"
SUBSYSTEM=="gpio", KERNEL=="gpio*", ACTION=="add", PROGRAM="/bin/sh -c 'chown root:dialout /sys%p/active_low /sys%p/direction /sys%p/edge /sys%p/value ; chmod 660 /sys%p/active_low /sys%p/direction /sys%p/edge /sys%p/value'"

将其放入 /etc/udev/rules.d/