Доступ к /dev/mem запрещен на raspberry pi

Я работаю со своим 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 для запуска своего скрипта, но когда я запускаю URL-адрес с моего сервера apache2, он говорит, что у меня нет доступа к /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

Есть ли способ, которым я могу запустить свой скрипт от имени пользователя root из вызова URL? Может ли кто-нибудь сказать мне, что я делаю неправильно?


person Thomas Wetmore    schedule 14.07.2014    source источник


Ответы (2)


Ваша проблема в том, что скрипт не выполняется от имени пользователя 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, у вас должен быть доступ. Обычно это было бы ужасной дырой в безопасности, но вы уже делаете прямой доступ к памяти. Будь очень осторожен!

Если вас это не устраивает, вам нужно обновить команду, чтобы она выполнялась от имени пользователя root (это хороший способ, но он требует от вас понимания того, что вы делаете!). Вы можете сделать это, изменив способ его вызова, или заключив вызов в скрипт, который сам изменяет пользователя, или используя setuid (это очень похоже на подход suEXEC, упомянутый ранее). Обернуть его в сценарий мне кажется лучшим способом, так как это должно позволить вашей записи в sudoers правильно применять привилегии только для этой команды, и это не требует от вас понимания всех последствий подходов setuid.

person Matthew Franglen    schedule 31.07.2014

Я обнаружил, что добавление www-данных в группу пользователей gpio работает нормально:

sudo usermod -aG gpio www-data

Вы также можете добавить www-data в группу пользователей памяти:

sudo usermod -aG kmem www-data

Как уже упоминалось, это плохая идея, но для меня это было необходимо.

person Ricky Nyairo    schedule 28.04.2018