【问题标题】:gpio script returned permission denied when run by user on gpio group raspberry pi当用户在 gpio 组树莓派上运行时,gpio 脚本返回权限被拒绝
【发布时间】:2017-10-02 23:15:46
【问题描述】:

在树莓派 1 上,raspbian stretch lite 版本 9.1 - 内核版本 4.9.52+

我制作了一个 shell 程序,通过树莓派的 gpio(文件名为 led.sh)点亮一个 LED。有一部分我需要与一些文件进行交互:

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 组中的用户身份运行它。这些是我试图在我的程序中处理的文件:

这就是我运行 led.sh 时发生的情况:

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

为什么该程序对这些文件的权限被拒绝,我该如何授予它权限/解决这个问题?

【问题讨论】:

  • 您是否将脚本标记为可执行?即chmod +x led.sh 可能会有所帮助。如果这解决了它,请删除这个 Q,因为它每天都会被问到;-/。祝你好运。
  • @shellter 这不是问题,谢谢你的评论。

标签: bash shell raspberry-pi raspbian gpio


【解决方案1】:

gpio/export 之后添加sleep 怎么样?

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

这似乎是一个时间问题。

【讨论】:

    【解决方案2】:

    echo "18" > /sys/class/gpio/export 中导出引脚时会创建值和方向文件。

    之后需要稍许延迟(例如:sleep 0.1),以便系统有时间“正确创建和设置文件的权限”。

    一个工作示例是:

    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
        # added to allow time for the file to be created before trying to use it
        sleep 0.1
        echo "out" > /sys/class/gpio/gpio18/direction
    
        # write output
        echo "1" > /sys/class/gpio/gpio18/value
        echo "led is on"
      fi
    }
    

    【讨论】:

      【解决方案3】:

      对于 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/

      【讨论】:

      • 这毫无意义,这个问题已经在 4 年前得到回答和解决,谢谢。
      猜你喜欢
      • 1970-01-01
      • 2017-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多