当 gpio 组 raspberry pi 上的用户 运行 时,gpio 脚本返回权限被拒绝
gpio script returned permission denied when run by user on gpio group raspberry pi
在 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 组中的用户身份进行此操作。这些是我试图在我的程序中弄乱的文件:
这是我 运行 led.sh:
时发生的情况
奇怪的是,我运行上的那些命令,shell一条一条都没问题。但是当我 运行 调用它们的脚本时,即使我在 gpio 组中,我也会被拒绝许可。首先,我认为 shell 可能会 运行 作为特殊用户发出命令,并通过在多个位置向 led.sh 添加 echo $EUID 进行检查,它们都返回了我的用户 ID。
为什么这个程序对这些文件的权限被拒绝,我该如何给它 permission/fix 这个?
在 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
}
在 gpio/export
之后添加一个 sleep
怎么样?
echo "18" > /sys/class/gpio/export
sleep 0.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/
.
在 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 组中的用户身份进行此操作。这些是我试图在我的程序中弄乱的文件:
这是我 运行 led.sh:
时发生的情况奇怪的是,我运行上的那些命令,shell一条一条都没问题。但是当我 运行 调用它们的脚本时,即使我在 gpio 组中,我也会被拒绝许可。首先,我认为 shell 可能会 运行 作为特殊用户发出命令,并通过在多个位置向 led.sh 添加 echo $EUID 进行检查,它们都返回了我的用户 ID。
为什么这个程序对这些文件的权限被拒绝,我该如何给它 permission/fix 这个?
在 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
}
在 gpio/export
之后添加一个 sleep
怎么样?
echo "18" > /sys/class/gpio/export
sleep 0.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/
.