【问题标题】:/dev/mem access denied on raspberry pi树莓派上的 /dev/mem 访问被拒绝
【发布时间】:2014-09-04 22:51:49
【问题描述】:

我正在使用我的 Raspberry Pi,我正在编写一个 cgi python 脚本,该脚本创建一个网页来控制我的 gpio 输出引脚。当我尝试将 RPi.GPIO 作为 GPIO 导入时,我的脚本崩溃了。这是我得到的错误:

File "./coffee.py", line 7, in <module>
    import RPi.GPIO as GPIO
RuntimeError: No access to /dev/mem.  Try running as root!

当我使用 sudo 运行我的脚本时,我的代码运行良好,但是当我从我的 apache2 服务器的 URL 运行时,它说我无权访问 /dev/mem。我已经尝试过编辑 visudo 并且没有用。这是我的 visudo 文件的样子:

#includedir /etc/sudoers.d
pi ALL=(ALL) NOPASSWD: ALL
www-data ALL=(root) NOPASSWD: /usr/bin/python3 /usr/lib/cgi-bin/coffee.py *
apache2 ALL = (root) NOPASSWD: /usr/lib/cgi-bin/coffee.py

我可以通过 URL 调用以 root 身份运行我的脚本吗?谁能告诉我我做错了什么?

【问题讨论】:

    标签: python cgi cgi-bin


    【解决方案1】:

    您的问题是脚本没有以 root 身份执行。它以apache运行的用户身份执行。

    您的 apache 进程以特定用户身份运行,可能是 www-data。您可以更改运行 apache 的用户。你应该可以在/etc/apache2/envvars找到这个:

    # Since there is no sane way to get the parsed apache2 config in scripts, some
    # settings are defined via environment variables and then used in apache2ctl,
    # /etc/init.d/apache2, /etc/logrotate.d/apache2, etc.
    export APACHE_RUN_USER=www-data
    export APACHE_RUN_GROUP=www-data
    

    如果您将其更改为 root,您应该可以访问。通常这将是一个可怕的安全漏洞,但您已经在进行直接内存访问。要非常小心!

    如果您对此感到不舒服,那么您需要update your command so it is executed as root(这是一个好方法,但它需要您了解自己在做什么!)。你可以通过改变你调用它的方式来做到这一点,或者通过将调用包装在一个本身会改变用户的脚本中,或者使用setuid(这与前面提到的 suEXEC 方法非常相似)。将它包装在脚本中对我来说似乎是最好的方法,因为这应该允许您在 sudoers 中的条目正确地应用该命令的权限,并且不需要您了解 setuid 方法的全部含义。

    【讨论】:

      【解决方案2】:

      我发现将 www-data 添加到 gpio 用户组效果很好:

      sudo usermod -aG gpio www-data
      

      您也可以将 www-data 添加到内存用户组:

      sudo usermod -aG kmem www-data
      

      如前所述,这是一个坏主意,但对我来说这是必要的。

      【讨论】:

        猜你喜欢
        • 2022-07-21
        • 2017-11-28
        • 1970-01-01
        • 1970-01-01
        • 2016-04-08
        • 1970-01-01
        • 1970-01-01
        • 2016-02-17
        • 1970-01-01
        相关资源
        最近更新 更多