【问题标题】:No access to /dev/mem. Try running as root on Raspberry Pi无法访问 /dev/mem。尝试在 Raspberry Pi 上以 root 身份运行
【发布时间】:2015-03-08 00:35:08
【问题描述】:

我是树莓派的菜鸟。我已经完成了所有设置,我正在尝试使用 shell_exec 通过浏览器运行文件。

这里是python文件的内容:

#! /usr/bin/python

import time
import RPi.GPIO as GPIO

PIN_17 = 17 # Define LED colour and their GPIO pin
GPIO.setmode(GPIO.BCM)

GPIO.setup(PIN_17, GPIO.OUT) # Setup GPIO pin

GPIO.output(PIN_17, True)  #Turn on
time.sleep (1)               #Wait
GPIO.output(PIN_17, False) #Turn off

GPIO.cleanup() #Useful to clear the board

我在目录/home/pi/ 中有一个名为trigger_pin.py 的文件

我正在尝试使用remote.php 中的以下 PHP 命令通过浏览器运行该文件:

<?php
$output = shell_exec("cd /home/pi/ && ./trigger_pin.py 2>&1"); //run command
echo "$output"; //output from command
?>

我得到的输出是:

Traceback (last recent call last): File "./trigger_pin.py", line 9, in GPIO.setup(PIN_17, GPIO.OUT) # Setup GPIO pin RuntimeError: No access to /dev/mem.尝试以 root 身份运行!

【问题讨论】:

    标签: php python raspberry-pi shell-exec


    【解决方案1】:

    默认情况下,Raspberry Pi 的 GPIO 接口需要超级用户(“root”)权限。您可能打开了一个 root 用户 shell,因此从命令行执行 Python 脚本不会出现问题。然而,您的 PHP 应用程序服务器可能正在以另一个用户身份运行。

    最直接的解决方案是将 PHP 应用程序服务器的用户(例如,www-data)添加到 /etc/sudoers,这将创建一个特权用户。

    www-data  ALL = NOPASSWD: ALL
    

    然后使用sudo 升级您的权限:

    shell_exec("cd /home/pi/ && sudo ./trigger_pin.py 2>&1");
    

    如果您这样做,请绝对确定您验证了您的 Web 服务器可以执行的安全性(即,不要在查看源代码的同时盲目安装 Web 脚本)。

    或者,您可以重构您的 Python 脚本以使用 pigpiopigpiod 守护程序,它以超级用户权限运行(因此您的应用程序不必这样做)。或者,您可以使用一个单独的工具,使用 setuid 以 root 身份运行,例如 Quick2Wire 的 GPIO Admin

    您还可以通过Raspberry Pi Stack Exchange 找到更多帮助。

    【讨论】:

      【解决方案2】:

      使用这个命令

      $ sudo python filename.py 
      

      【讨论】:

      • OP 不是从命令行运行它,而是从 web 应用程序调用的脚本中执行。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-17
      • 1970-01-01
      • 2012-05-03
      • 1970-01-01
      • 2016-01-25
      • 2021-07-06
      相关资源
      最近更新 更多