我正在使用我的Raspberry Pi,我正在编写一个cgi python脚本,创建一个网页来控制我的gpio out引脚。当我尝试将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身份运行我的脚本?谁能告诉我我做错了什么?
答案 0 :(得分:1)
我发现将www-data添加到gpio用户组工作正常:
sudo usermod -aG gpio www-data
您还可以将www-data添加到内存用户组:
sudo usermod -aG kmem www-data
如上所述,这是一个坏主意,但对我来说这是必要的。
答案 1 :(得分:0)
您的问题是该脚本不是以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的全部含义方法